3天玩转shell--7.awk编程技巧一

简介: 本文将通过shell代码示例,简单通俗的讲解shell。通过执行代码和运行结果反向掌握shell编程方法。准备一台低配的阿里云ECS Linux环境,跟着教程走起,本文比较适合shell小白。

一、这节课掌握如下几个知识点

【1】掌握awk的字符分隔
【2】掌握awk字符匹配的用法
【3】掌握awk流程控制的if判断
【4】掌握awk编程的循环for、while

二、代码讲解

先根据附件中的文档创建7.example.txt的测试文件。
#!/bin/bash
#7.sh v1
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
export LANG=zh_CN.UTF-8
export PATH

#1.文件中某一列的字符提取及字符切割
#$0-$NF 从第一列到最后一列
sed -n '1,3p' 7.example.txt    #用sed将文件中的1到3行过滤出来
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print}'  #用sed将文件中的1到3行过滤出来并通过awk全部打印
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $0}' #用sed将文件中的1到3行过滤出来打印第1列
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $1}'#用sed将文件中的1到3行过滤出来打印第2列
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $2}' #用sed将文件中的1到3行过滤出来打印第3列
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $NF}'#用sed将文件中的1到3行过滤出来打印最后一列
echo "=================-F 切割参数"
awk -F '[ :]' 表示既可以是空格,也可以是冒号进行分隔
sed -n '5,7p' 7.example.txt  #用sed将文件中的5到7行过滤出来
echo "--------------"
sed -n '5,7p' 7.example.txt|awk -F "," '{print $2}' #用sed将文件中的5到7行过滤出来并进行逗号切割后,打印第二列
echo "--------------NR 表示输入的行数"
sed -n '9,11p' 7.example.txt|awk -F ",|;" '{print $2}'#用sed将文件中的9到11行过滤出来并进行逗号,竖线,分号切割后,打印第二列
echo "--------------"
sed -n '9,11p' 7.example.txt|awk '{print NR}' #用sed将文件中的9到11行过滤出来并用awk输出行号

#2.字符串匹配
echo "=================="
sed -n '13,17p' 7.example.txt  #用sed将文件中的13到17行过滤出来
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '/yidong2/' #用sed将文件中的13到17行过滤出来,并将匹配yidong2的行打印出来
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '/yidong2/{print $2}' #用sed将文件中的13到17行过滤出来,并将匹配yidong2的行打印第二列
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '$1 ~ /10010/{print $2}' #用sed将文件中的13到17行过滤出来,并将第一列匹配到10010的行打印第二列
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '$1 ~ /\<10010\>/{print $2}' #用sed将文件中的13到17行过滤出来,并将第一列绝对匹配10010的行打印第二列
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '$1 ~ /10010/ && $NF ~ /liantong2/{print $2}' 
 #用sed将文件中的13到17行过滤出来,并将第一列匹配10010,和最后一列匹配liantong2的第二列打印出来

#3.awk中使用if判断
echo "=================="
sed -n '1,3p' 7.example.txt
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '$2>=30{print}'   #用sed将文件中的1到3行过滤出来,并将第二列大于等于30的行打印出来。
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '$2>=30{print $1,$2}'  #用sed将文件中的1到3行过滤出来,并将第二列大于等于30的行,然后将第一列、第二列打印出来。
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '($2>=30)&&($1~/wang/){print $3}' #用sed将文件中的1到3行过滤出来,并将第二列大于等于30的行,并且第一列匹配wang的行匹配出来并打印第三列
echo "--------------"
sed -n '19,22p' 7.example.txt
echo "--------------"
sed -n '19,22p' 7.example.txt|awk '{if (NR%2==0){print $0} else {printf "%s ",$0}}'   #用sed将文件中的19到22行过滤出来,并将偶数列和奇数列分别打印不同的信息
echo "--------------"
sed -n '24,27p' 7.example.txt|awk '{ if(NR==2){print $0/4} else if(NR==4){print $0/3} else {print} }'  #用sed将文件中的24到27行过滤出来,并将第二行的第一列除4,第四行的第一列除3,其余的全部打印。

#4.awk中使用循环for,while
echo 5 6 7 8|awk '{ for (i=1;i<=NF;i++) { if ($i>6) {print $i} } }'  #循环判断5678,并打印大于6的值
echo 5 6 7 8|awk '{for (i=1;i<=NF;i++) { sum+=$i }; {print sum} }'  #将5678求和
sed -n '24,27p' 7.example.txt|awk '{N+=$1} END {print N/NR}'  #用sed将文件中的24到27行过滤出来,并求第一列数据的平均数
sed -n '24,27p' 7.example.txt|awk 'BEGIN {max = 0} {if ($1+0 > max+0) max=$1 fi} END {print max}'  #用sed将文件中的24到27行过滤出来,并求第一列的最大值
#awk默认按照字符串比较的,如果要比较数值,需要先强制类型转换,即 $1+0,转换成整数。
sed -n '24,27p' 7.example.txt|awk 'BEGIN {min = 65535} {if ($1+0 < min+0) min=$1 fi} END {print min}' #用sed将文件中的24到27行过滤出来,#求最小值
awk 'BEGIN{ test=100; total=0; while(i<=test) { total+=i;  i++; } print total; }' #求1-100的累加
awk 'BEGIN{ total=0; i=0; do { total+=i;  i++; }while(i<=100) print total; }'  #求1-100的累加

三、课程附件

附件1:7.example.txt

xiaoming 23 1500
xiaodong 32 2300
xiaowang 43 3200
===========
xiaoming,23,1500
xiaodong,32,2300
xiaowang,43,3200
===========
xiaowang,43;3200
xiaowang;43,3200
xiaowang,43,3200
=========ƥӡ=
10086 cmc yidong
100860 ccc yidong2
10010 cnc liantong
100101 ccc liantong2
10000 ctc dianxing
==========if һ=
192.168.1.17
down
192.168.1.103
open
=======if-else===
125
32
126
54
==========
cc 750
aa 181
bb 37
bb 725
aa 42
cc 72
=====BEGIN END====
one:16.32
two:13.28
three:15.65
相关文章
|
11月前
|
Shell Linux
Linux Shell 进阶:探索高级命令和脚本编程技巧
Linux Shell不仅仅是一个命令解释器,它还提供了许多强大的高级命令和脚本编程技巧,能够帮助用户更高效地管理系统和处理数据。在这篇文章中,我们将深入探讨Linux Shell的高级功能。
148 0
|
4月前
|
Shell Linux C语言
Linux中执行Shell的函数(popen,system,exec)介绍:分享一些常用的执行Shell的函数及其相关编程技巧和经验
Linux中执行Shell的函数(popen,system,exec)介绍:分享一些常用的执行Shell的函数及其相关编程技巧和经验
111 0
|
弹性计算 Shell Linux
3天玩转shell--10.shell编程技巧汇总
本文将通过shell代码示例,简单通俗的讲解shell。通过执行代码和运行结果反向掌握shell编程方法。准备一台低配的阿里云ECS Linux环境,跟着教程走起,本文比较适合shell小白。
117 0
|
弹性计算 Shell 测试技术
3天玩转shell--8.awk编程技巧二
本文将通过shell代码示例,简单通俗的讲解shell。通过执行代码和运行结果反向掌握shell编程方法。准备一台低配的阿里云ECS Linux环境,跟着教程走起,本文比较适合shell小白。
119 0
|
7天前
|
Shell
Shell脚本有哪些基本语法?
【9月更文挑战第4天】
32 17
|
7天前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
24 12
|
6天前
|
网络协议 关系型数据库 MySQL
Shell 脚本案例
Shell 脚本案例
23 8
|
6天前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
|
22天前
|
Ubuntu Linux Shell
在Linux中,如何使用shell脚本判断某个服务是否正在运行?
在Linux中,如何使用shell脚本判断某个服务是否正在运行?
|
20天前
|
Java Shell Linux
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
关于如何使用Shell脚本来解析Linux系统中的应用服务日志,提供了脚本实现的详细步骤和技巧,以及一些Shell编程的技能扩展。
21 0
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志