awk 擅长对列进行操作/进行数据信息的统计
作用特点:
语法格式:
awk [参数] ‘模式-动作’ 文件
命令:
-F | 定义分隔符 |
---|---|
-v | 设置变量 |
NF | 最后一列 |
$符号用法:
符号 | 用法 |
---|---|
$1 $2 $3 | 取对应列 |
$NF | 最后一列 |
$(NF-n) | 取倒数第几列 |
$0 | 取所有列的信息 |
单行NR==,多行区间用”,“,指定行之间分隔用”;”
#查询第二行 awk 'NR==2' awk_test.txt #查询二到六行 awk 'NR==2,NR==6' awk_test.txt #查询第二行和第六行 awk 'NR==2;NR==6' awk_test.txt
多行查询同行查询,“,”与”;”
awk '/Xiaoyu/' awk_test.txt
筛选结果之间的连接符号
awk '/Xiaoyu/{print $1,$3}' awk_test.txt Zhang 390320151 awk '/Xiaoyu/{print $1","$3}' awk_test.txt Zhang,390320151
指定分隔符”-F”
awk -F ":" '/^Zhang/{print $3}' awk_test.txt
如果行中同时存在多个不同分隔符-F” :”
#Zhang Dandan 41117397 :250:100:175 awk -F "[ :]+" '/^Zhang/{print $1,$2,$5}' awk_test.txt #取倒数第二列$(NF-1) awk -F "[ :]+" '/^Zhang/{print $1,$2,$(NF-1)}' awk_test.txt
在某列中筛选,输出其他列信息
#显示所有以41开头的ID号码的人的全名和ID号码 #在第三列中匹配41开头的结果,并显示第1,2,3列信息 awk '$3~/^41/{print $1,$2,$3}' awk_test.txt #显示所有ID号码最后一位数字是1或5的人的全名 awk '$3~/1$|5$/{print $1,$2}' awk_test.txt awk '$3~/[15]$/{print $1,$2}' awk_test.txt|column -t awk '$3~/(1|5)$/{print $1,$2}' awk_test.txt|column -t
gsub(/需要替换的信息/,“修改成什么信息”,将哪列信息进行修改)
在print之前,先替换,再输出
#显示Xiaoyu的捐款,每个捐款数值前面都有以$开头, 如$110$220$330 awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt
匹配的条件信息
awk '/^oldboy/{print xx}'
NR==2 NR>=2 NR<=2
awk 'BEGIN{print "姓名","QQ号","记录"}{print $0}' awk_test.txt | column -t
awk 'BEGIN{FS=":"}{print $2}' awk.txt
最后显示信息
awk 'BEGIN{print "姓名","QQ号","记录"}{print $0}END{print "操作结束"}' awk.txt|column -t
统计空行
awk '/^$/{i++}END{print i}' /etc/services
统计系统中多少普通用户,虚拟用户
#普通用户 awk '$NF~/\/bin\/bash/{i++}END{print i' /etc/passwd #虚拟用户,取反即可 awk '$NF!~\/bin\/bash/{i++}END{print i}' /etc/passwd
求和运算
seq 10 |awk '{sum=sum + $1;print sum}'
变量名 | 英文 | 意义 |
---|---|---|
FS | field separator | 字段分隔符变量 |
NR | number records | 表示行号信息 |
NF | number of fields | 表示每一行有多少列 |