awk是一种可以处理数据、产生格式化报表的语言,功能相当强大。awk的工作方式是读取数据文件,将每一行数据视为一条记录(record),每笔记录以字段分隔符分成若干字段,然后输出各个字段的值。
ps -ef | awk '{print $2}'
awk对每一条记录,都会套用一个"样式{操作}",如果该行符合样式,就执行指定的操作。样式或操作之一,可以省略。如果只有样式,表示要显示符合样式的数据行;如果只有操作,表示对每一数据行都执行该项操作。
awk常用的作用格式:
awk "样式" 文件: 把符合样式的数据行显示出来
awk '{操作}' 文件:对每一行都执行{}中的操作.
awk '样式{操作}'文件:对符合样式的数据行,执行{}中的操作.
示例1:
awk '/La/' dataf3
显示含'/La/'的数据行
示例2:
awk '{ print $1,$2 }' dataf3
显示dataf3每一行的第1和第2个字段
示例3:
awk '/La/{print $1,$2}' dataf3
将含有La关键词的数据行的第1及第2个字段显示出来
示例4:
awk -F: '/^ols3/{ print $3,$4 }' /etc/passwd
使用选项-F,指定:为分隔字符,帐号ols3的uid(第3字段)及gid(第4字段)显示出来.
示例5:
awk -F: 'BEGIN{OFS="+++"}/^ols3/{ print $1,$2,$3,$4,$5 }' /etc/passwd
以:为分隔字符,+++为输出字段分隔符,将帐号ols3的第1~5栏显示出来
输出: ols3+++x+++1002+++1002+++
本例中,BEGIN{}区域指示awk一开始先做初始化的操作,即设定OFS="+++"。变量OFS的作用是存储输出字段的分隔符。接着,寻找ols3的帐号行,找到后,使用print印出第1~第5个字段,且彼此用 +++ 隔开.
实例应用
1.取得网卡的IP:
ifconfig | grep 'inet addr:' | grep Bcast | awk '{print $2}' | awk -F: '{print $2}'
2.取得网络设备名称:
cat /proc/net/dev | awk -F: '/eth.:|ppp.:|wlan.:/{print $1}'
在本例中,-F:把分隔字符设为:,而且,采用多选一的样式 /eth.:|ppp.:|wlan.:/。这个样式的意思是:设备名称可以是eth0:、ppp1:、wlan1:这3个其中之一。一旦找到符合样式的字符串后,去掉:,取其中的第一个域值,因此,可能的答案是etho0或ppp1或wlan1。
3.取得系统内在大小
cat /proc/meminfo | awk '/MemTotal/{print $2}'
假设将值存在文件t中,文件t内容如下,第一行:a b c
需要将a、b和c分别赋给外部变量x、y和z,则脚本可写成如下:
eval $(awk 'NR==1{ printf("x=%s\ny=%s\nz=%s",$1,$2,$3); }' ./t)
echo $x
echo $y
echo $z
请注意printf函数中的换行符\n是必须的,起关键作用的是eval命令,它在很多场景有特别的用处