频道栏目
首页 > 系统 > Linux > 正文
Linux系统下awk编程使用示例
2017-12-07 10:38:53      个评论    来源:zhuqiuhui的专栏  
收藏   我要投稿

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 '$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 更适合格式化文本,对文本进行较复杂格式处理
点击复制链接 与好友分享!回本站首页
相关TAG标签 Linux 系统 awk 编程
上一篇:Ubuntu 16.04 LTS系统安装 TeamViewer 远程协助软件
下一篇:Linux 配置cifs文件服务
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站