欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux awk使用示例

程序员文章站 2022-04-30 14:46:47
...

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 更适合格式化文本,对文本进行较复杂格式处理
相关标签: linux awk 编程

上一篇: awk命令的使用

下一篇: awk命令使用