文章目录
前言
本文接着上篇博客来写,主要内容为awk命令的各种应用。
一、内建变量
awk常用内置变量:$1、$2、NF、NR、$0
$1:代表第一列
$2:代表第二列以此类推
$0:代表整行
NF:一行的列数
NR:行数
案例
1、awk -F: ‘/bash $/{print $0}’ /etc/passwd—————————在所有行中输出以bash结尾的所有行

2、awk -F: ‘{print NR}END{print NR}’ /etc/passwd——————————输出1、2行的行号、数据以及总行数

3、awk -F: ‘NR2 || NR3{print $1,$2}’——————————打印第二行,第三行中的1、3列

4、awk -F: ‘END{print $0}’ /etc/passwd———————————打印最后一行

5、ifconfig ens33 | awk ‘/broadcast/{print $2}’ ——————打印ip地址

二、BEGIN END 运算
逐行执行开始之前执行什么任务,结束之后再执行什么任务,用BEGIN、END
BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次
END一般用来做汇总操作,仅在读取完数据记录之后执行一次
2.1 awk运算
例如 :awk “BEGIN{a=100+200,print a}” —————————将a赋值为100+200,并进行运算和输出

2.2 模糊匹配
案例:awk -F: ‘$1~/x/{print $1,$3}’ /etc/passwd——————————打印第一列中包含x的行中的1、3列

2.3关于数值与字符串的
== :等于
!= :不等于
<= :小于等于
= : 大于等于
:大于
< : 小于
awk -F: ‘$3>1000{print $1,$3,$7}’ /etc/passwd ——————————输出第三列大于1000的所有行的第1、3、7列

2.4 逻辑运算
&& 要求所有条件都为真时才为真,否则为假。
|| 只要有一个条件为真就为真,全为假时才为假。
案例1:
awk -F: ‘NR>=3 && NR<=10{print $1"\t"$3"\t"$7}’ /etc/passwd ——————————输出大于等于第三行,小于等于第十行的所有行中的1、3、7列

案例2:awk -F: ‘$3==1000 || NR<=5{print}’ /etc/passwd ——————————打印第三列等于1000以及行数小于等于5的所有列

2.5 扩展
其他内置变量的用法FS(输入)、OFS、NR、FNR、RS、ORS
FS:输入字段的分隔符 默认是空格
OFS:输出字段的分隔符 默认也是空格
FNR:读取文件的记录数(行号),从1开始,新的文件重新重1开始计数
RS:输入行分隔符 默认为换行符
ORS:输出行分隔符 默认也是为换行符
案例一:awk ‘{FS=“:”;OFS=“,”}NR==2{print $1,$2,$3}’ /etc/passwd————————输出第二行的1、2、3列选择输入字段为:,输出字段位

案例二:awk ‘BEGIN{RS=“:”}{print}’ /etc/passwd————————指定换行符位:

三、awk高级用法 if语句
awk的if语句也分为单分支、双分支和多分支
用法:awk -F分隔符 ‘{if语句}{print输出的行与列}’ 文本
单分支案列:awk -F: ‘{if ($3 <= 1000){print $1}}’ /etc/passwd ——————————输出第三列小于等于1000的所有列

双分支案例:awk -F: ‘{if($3<1000){print $1}else{print $1,$3,$7}}’ /etc/passwd ——————如果第三列大于1000,则输出第一列,如果不是则输出第一、三、七列

多分支案例:awk -F: ‘{if($3==1000){print $1}else if($3<1000){print $1,$3}else{print $1,$3,$7}}’ /etc/passwd ——————第三列等于1000则输出第一列,第三列小于1000则输出1、3列,大于1000则输出1、3、7列

四、BEGIN END 流程
awk还支持for循环、while循环、函数、数组等
其他:awk ‘BEGIN{ commands } pattern{ commands } END{ commands }’
流程:
第一步:运行BEGIN{ commands }语句块中的语句。
第二步:从文件或标准输入(stdin)读取一行。然后运行pattern{ commands }语句块,它逐行扫描
文件,从第一行到最后一行反复这个过程。直到文件所有被读取完成。
第三步:当读至输入流末尾时,运行END{ commands }语句块。
awk -F: ‘!($3>10){print $1,$2,$3}’ /etc/passwd —————————取第三列小于等于10的行

awk -F: ‘($7 != “/bin/bash”)&&($7 != “/sbin/nologin”){print}’ /etc/passwd ——————输出第七列既不是/bin/bash也不是/sbin/nologin的所有行的所有列

awk -F: ‘($7~bin)(NF==7){print $1,$7}’ /etc/passwd ——————————输出第7列有bin并且有七个字段(一行有7列)的所有行的1、7列

awk -F “:” ‘$7~“bash”{print $1,123}’ /etc/passwd ————————输出第七列后面包含bash的行的第1列,并在后面加上123

总结
本文接着上篇博客来写,主要内容为awk命令的各种应用。希望本文内容能对大家有所帮助,谢谢观看😜

被折叠的 条评论
为什么被折叠?



