Linux awk使用示例

来源:互联网 发布:淘宝的聚划算怎么抢 编辑:程序博客网 时间:2024/05/21 01:51

        • awk用法
        • 示例
        • awk编程
        • 对比

awk用法:

awk 'pattern {action}'

ARGC 命令行变元个数
ARGV 命令行变元数组
FILENAME 当前输入文件名
FNR 当前文件中的记录号
FS 输入域分隔符,默认为一个空格
RS 输入记录分隔符
NF 当前记录里域个数
NR 到目前为止记录数
OFS 输出域分隔符
ORS 输出记录分隔符

示例:

test.txt

test zqhtttttttgoodI adm student!3242test 444zhauiqhui,zqhbboy 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 zqhtttttttgoodI adm student!3242test 444zhauiqhuibboy zqh or die!end--$ awk -F, '/zqh/' test.txt # 查找关键字为'zqh'的内容输出:test zqhzhauiqhui,zqhbboy zqh or die!$ awk '/zqh/{print $1}' test.txt # 输出包含关键字为'zqh'的行第一个值(以空格或TAB分割)输出:testzhauiqhui,zqhbboy$ awk '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' test.txt # 统计test.txt中文件名,每行的行号,每行的列数,对应的完整行内容输出:filename:test.txt,linenumber:1,columns:2,linecontent:test zqhfilename:test.txt,linenumber:2,columns:1,linecontent:tttttttfilename:test.txt,linenumber:3,columns:1,linecontent:goodfilename:test.txt,linenumber:4,columns:3,linecontent:I adm student!filename:test.txt,linenumber:5,columns:2,linecontent:3242test 444filename:test.txt,linenumber:6,columns:1,linecontent:zhauiqhui,zqhfilename: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 zqhtttttttgoodI adm student!3242test 444zhauiqhui,zqhbboy 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 test1 ttttttt2 good3 I4 3242test5 zhauiqhui,zqh6 bboy

对比

  • grep 更适合单纯的查找或匹配文本
  • sed 更适合编辑匹配到的文本
  • awk 更适合格式化文本,对文本进行较复杂格式处理
原创粉丝点击