awk用法:
awk 'pattern {action}'
ARGC 命令行变元个数
ARGV 命令行变元数组
FILENAME 当前输入文件名
FNR 当前文件中的记录号
FS 输入域分隔符,默认为一个空格
RS 输入记录分隔符
NF 当前记录里域个数
NR 到目前为止记录数
OFS 输出域分隔符
ORS 输出记录分隔符
示例:
test.txt
test zqh
ttttttt
good
I adm student!
3242test 444
zhauiqhui,zqh
bboy zqh or die!
$ awk '{print $1,$4}' test.txt # 每行按空格或TAB分割,输出文本中的1、4项
$ awk -F, '{print $1,$2}' test.txt # 使用","分割,输出文本中的1、2项
$ awk 'BEGIN{FS=","} {print $1,$2}' test.txt #使用内建变量
$ awk -F '[ ,]' '{print $1,$2,$5}' test.txt #多个分隔符,先使用空格分割,然后对分割结果再使用","分割
$ awk -F ',' 'BEGIN {print "start--"} {print $1} END {print "end--"}' test.txt # 所有行开始输出添加'start--',在最后一行添加'end--'
输出:
start--
test zqh
ttttttt
good
I adm student!
3242test 444
zhauiqhui
bboy zqh or die!
end--
$ awk -F, '/zqh/' test.txt # 查找关键字为'zqh'的内容
输出:
test zqh
zhauiqhui,zqh
bboy zqh or die!
$ awk '/zqh/{print $1}' test.txt # 输出包含关键字为'zqh'的行第一个值(以空格或TAB分割)
输出:
test
zhauiqhui,zqh
bboy
$ awk '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' test.txt # 统计test.txt中文件名,每行的行号,每行的列数,对应的完整行内容
输出:
filename:test.txt,linenumber:1,columns:2,linecontent:test zqh
filename:test.txt,linenumber:2,columns:1,linecontent:ttttttt
filename:test.txt,linenumber:3,columns:1,linecontent:good
filename:test.txt,linenumber:4,columns:3,linecontent:I adm student!
filename:test.txt,linenumber:5,columns:2,linecontent:3242test 444
filename:test.txt,linenumber:6,columns:1,linecontent:zhauiqhui,zqh
filename:test.txt,linenumber:7,columns:4,linecontent:bboy zqh or die!
注:上面命令可用:
$ awk -F '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' test.txt 来代替
$ awk '$1 ~ /zqh/ {print $1,$3}' test.txt #找出第一列包含 "zqh",并打印该行的第一列与第三列,其中~是模式的开始
输出:zhauiqhui,zqh
$ awk 'BEGIN{IGNORECASE=1} /zqh/' test.txt # 忽略大小写
$ awk '$2 !~ /zqh/ {print $2,$4}' log.txt #找出不包含"zqh",并打印该行的第二列与第四列
awk编程
$ awk '$1>2' test.txt # 输出第一列大于2的行
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' test.txt # 输出第一列大于2并且第二列等于'Are'的行
$ awk '{count++; print $0;} END{print "count is ", count}' test.txt
输出:
test zqh
ttttttt
good
I adm student!
3242test 444
zhauiqhui,zqh
bboy zqh or die!
count is 7
$ awk 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' test.txt
输出:
0 test
1 ttttttt
2 good
3 I
4 3242test
5 zhauiqhui,zqh
6 bboy
对比
- grep 更适合单纯的查找或匹配文本
- sed 更适合编辑匹配到的文本
- awk 更适合格式化文本,对文本进行较复杂格式处理