liunx常用命令-awk

490 阅读2分钟

1.AWK简介

awk是对文本进行格式化的工具,适合处理比较复杂的文本格式

awk命令格式:awk [option] 'Pattern{Action}'file1,file2....

#Action最常使用的是print,默认以空白字符分隔

#$0代表整行,$1代表第一个字段,$2代表第二个....多个字段用,隔开
awk '{print $1,$2}' log.sh
#可拼接打印
awk '{print "this is "$1,$2}' log.sh

#option参数:
(1) -F,用于指定输入分隔符
#例如文件log.sh内容如下:
#host:192.168.1.13
#url:http://192.168.1.13/operuser
awk -F ":" '{print $S2}' log.sh
#输出结果:192.168.1.13
#         http://192.168.1.13/operuser
(2) -OFS,输出字段分隔符,默认为空白字符,OFS为内置变量,需要注意的是,使用变量时,要使用-v选项来指定对应的变量
awk  -F ":" -v OFS="-->"'{print $1,$2}'
#输出结果:host-->192.168.1.13
#         url-->http://192.168.1.13/operuser

#pattern作为条件,判断当前行是否满足条件,若跟pattern匹配,则进行后面的处理,否则,跳过当前行。
awk -F ":"'NR=='2'{print}' log.sh#打印第二行数据


awk变量

变量名 变量描述
FS 输入字段分隔符,默认为空白字符
OFS 输出字段分隔符,默认为空白字符
RS 输入记录分隔符(输入换行符),指定输入时的换行符
ORS 输出记录分隔符(输出换行符),指定输出时的换行符
NF 当前行的字段数(当前行被分隔符分割成了几段)
NR 当前行的行号
FNR 不同文件分别计数
FILENAME 当前文件名
ARGV 数组,保存的是命令行所给定的各参数
ARGC ARGC数组的个数

2.实例

1)将log1.sh文件中的81端口更改为80

log1.sh文件内容如下:
djksjds 81
fsdkfsd 81
fsdfsdfsd 81
fdsfsdfsdf 81

awk '{sub('80','81');print>"log1.sh"}' log1.sh
#可以使用正则表达式sub
#注意:重定向符号后面的文件名需要加双引号

2)将log文件中按照接口地址出现的次数倒序展示,并同时展示次数

log.sh文件内容如下:
192.168.1.3 10:22 api/getmeminfo
192.168.1.4 10:23 api/finduser
192.168.1.5 10:24 api/operorder
192.168.1.6 10:25 api/getmeminfo
192.168.1.7 10:26 api/payorder
192.168.1.3 10:22 api/getmeminfo
192.168.1.3 10:22 api/operorder
192.168.1.3 10:22 api/finduser
192.168.1.3 10:22 api/operorder
192.168.1.3 10:22 api/finduser

awk '{print $3}' log.sh|sort|uniq -c|sort -rn
结果如下:
      3 api/operorder
      3 api/getmeminfo
      3 api/finduser
      1 api/payorder