目录
一、awk
1、awk工作原理
逐行读取文本,默认以空格或TAB键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理。
awk信息的读入也是逐行读取的,执行结果可以通过print的功能将数据字段打印显示。
在使用awk命令的过程中,可以使用逻辑操作符“&&”表示“与”、“| |”表示“或”、“!“表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方
$0 表示显示整行 ,$NF表示当前行分割后的最后一列($0和$NF均为内置变量)
2、awk命令格式
awk 选项 '模式或条件{操作}' 文件1 文件2.....
awk -f 脚本文件 文件1 文件2 ......
awk常见的内建变量(可直接使用)
FS | 列分隔符。指定每行文本的字段分隔符,默认为空格或制表位。与’-F’作用相同 |
NF | 当前处理的行的字段个数 |
NR | 当前处理的行的行号(序数) |
$0 | 当前处理的行的整行内容 |
$n | 当前处理的行的第n个字段(第n列) |
FILENAME | 被处理的文件名 |
RS | 行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,二awk一次仅读入一条记录,以进行处理。预设值是’\n’ |
二、awk使用
1、按行输出文本
awk '{print}' 1.txt #输出所有内容
awk '{print $0}' 1.txt #输出所有内容
awk 'NR==2,NR==4{print}' 1.txt #打印第2~4行内容
awk 'NR==2||NR==4{print}' 1.txt #打印第2和第4行内容
awk '(NR<=3)||(NR>=5){print}' 1.txt #打印第1~3,5~9行内容
awk '(NR%2)==1{print}' 1.txt #输出所有奇数行的内容
awk '(NR%2)==0{print}' 1.txt #输出所有偶数行的内容
输出指定字符的行
awk '/^a/{print}' 2.txt #打印以a开头的行
awk '/z$/{print}' 2.txt #打印以z结尾的行
awk中特殊模式
BEGIN 模式指定了处理文本之前需要执行的操作
END 模式指定了处理完所有行之后所需要执行的操作
BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作; awk再处理指定的文本,之后再执行END模式中指定的动作,END{}语句块中, 往往会放入打印结果等语句
awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd
awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd #统计以/bin/bash 结尾的行数
grep -c "/bin/bash$" /etc/passwd
2、按字段输出文本
awk -F: '{print $1}' /etc/passwd #以:为分隔符,打印第一列
awk -F: '!($3<5) {print $1,$3}' /etc/passwd #以:为分隔符,满足第三列数字不小于5的行打印第一列和第三列
awk 'BEGIN{FS=":"};{if($3>5){print $1,$3}}' /etc/passwd
FS:指定字段分隔符,在处理文本之前,先用BEGIN把FS重新赋值
awk -F ":" '{max=($3>$4)?$3:$4;{print max}}' /etc/passwd #($3>$4)?$3:$4三元运算符,如果第3个字段的值大于第4个字段的值,则把第3个字段的值赋给max,否则第4个字段的值赋给max
awk '{print NR,$0}' 3.txt #打印行号和内容
3、通过管道、双引号调用shell命令
查看内存使用率
查看当前cpu空闲率
top -b -n 1 显示top的一次结果,指定,为分隔符,筛选出cpu行,截取第四个字符,
再次筛选出第四个字符的第一个字符,再以百分比显示输出
OFS 表示输出时可设置改变分割符
$1=$1是用来激活$0的重新赋值,也就是说
字段$1…和字段数NF的改变会促使awk重新计算$0的值,通常是在改变OFS后而需要输出$0时这样做