Linux常用命令之awk命令

-----------awk命令-----------
说明:
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

有三种方式调用awk

1.命令行方式

awk [-F  field-separator]  'commands'  input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。
通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

2.shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk
格式为: ./awk脚本文件 输入文件

3.插入文件方式
将所有的awk命令插入一个单独文件,然后调用:

awk -f awk-script-file input-file(s)
awk -f awk脚本文件 输入文件
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。

awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。

  • ARGC 命令行参数个数
  • ARGV 命令行参数排列
  • ENVIRON 支持队列中系统环境变量的使用
  • FILENAME awk浏览的文件名
  • FNR 浏览文件的记录数
  • FS 设置输入域分隔符,等价于命令行 -F选项
  • NF 浏览记录的域的个数
  • NR 已读的记录数
  • OFS 输出域分隔符
  • ORS 输出记录分隔符
  • RS 控制记录分隔符

例:

last -n 5    |awk '{print $1}'      
#显示最近登录的5个账号。

cat /etc/passwd |awk -F ':' '{print $1}'        
#显示/etc/passwd的账户。

cat /etc/passwd |awk -F ':' '{print $1 "\t" $7}' 
#显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割。

cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1 "," $7} END{print "这里结束了"}'        
#只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,
#而且在所有行添加列名name,shell,在最后一行打印“这里结束了”。

awk -F: '/root/' /etc/passwd  
#搜索/etc/passwd有root关键字的所有行。

awk -F ':' '/root/{print $7}' /etc/passwd
#搜索/etc/passwd有root关键字的所有行,并显示对应的shell。

awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd  
#统计/etc/passwd文件名,每行的行号,每行的列数,对应的完整内容。

awk -F ':' '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd        
#使用printf替代print,可以让代码更加简洁,易读。

awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd    
#统计/etc/passwd的账户人数,count是自定义变量。

awk 'BEGIN {count=0;print "start usr count is ", count} {count=count+1;print $0;} END{print "end user count is", count }' /etc/passwd    
#初始化count,虽然默认是0,但是妥当的做法还是初始化为0。

ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "end size is ", size}'  
#统计某个文件夹下的文件占用的字节数。

ls -l |awk 'BEGIN {size=0;} {size=size + $5;} END{print "end size is", size/1024/1024 "M"}'   
#同上,以M为单位显示;注意,统计不包括文件夹的子目录。

awk -F ':' 'BEGIN {count=0;} {name[count] = $1; count++;}; END{for(i=0; i < NR; i++) print i, name[i]}' /etc/passwd      #显示/etc/passwd的账户。

awk -F ':' '$1~/root/ {OFS="#";print $1,$2}' 1.txt    
#第一个段匹配root的行,并以#作为分隔符输出结果。

awk -F ':' '$1=="root" || NR>20 {OFS="#";print $1,$2}' 1.txt     
#匹配root或者行号大于20的行的结果。

awk -F ':' '$1=$3+$4 {print}' 1.txt        
#把第一段用第3和第4段的和的结果表示,并打印出全部结果。

awk -F ':' 'NF >3 && NF<10 {print}' 1.txt  
#显示分段数量在3-10之间的结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执子之意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值