awk的用法

awk 是一种可以处理数据、产生格式化报表的语言,功能相当强大。awk 的工作方式是 读取数据文件,将每一行数据视为一条记录(record),每笔记录以字段分隔符分成若干字段, 然后输出各个字段的值。

以下是执行 ps auxw 的输出片段:

USER      PID %CPU %MEM VSZ RSS TTY        STAT START TIME COMMAND  
root       1  0.0  0.0  164   92 ?          Ss Apr09 0:01 init [5] 

像这种固定结构的数据,用 awk 来处理,特别有威力,通常只要短短几行程序代码就可 以完成工作。

例如,仅用以下单一指令,就可取得所有行程的 PID:

ps auxw | awk '{print $2}'  

那么,awk 是如何处理每一笔记录的呢?

awk 对每一条记录,都会套用一个“样式{操作}”,如果该行符合样式,就执行指定的操 作。样式或操作之一,可以省略。如果只有样式,表示要显示符合样式的数据行;如果只有 操作,表示对每一数据行都执行该项操作。

以下是 awk 常用的作用格式:

  • awk“样式”文件:把符合样式的数据行显示出来。
  • awk '{操作}' 文件:对每一行都执行{}中的操作。

sed awk 和入门z awk '样式{操作}' 文件:对符合样式的数据行,执行{}中的操作。

  • awk 的用法 1:
awk '/La/' dataf3 

显示含 La 的数据行。

  • awk 的用法 2:
awk '{ print $1, $2 }' dataf3  

显示 dataf3 每一行的第 1 和第 2 个字段。 $1 代表第 1 个字段,$2 代表第二字段,其他类推。

  • awk 的用法 3:
awk '/La/{ print $1, $2 }' dataf3  

将含有 La 关键词的数据行的第 1 及第 2 个字段显示出来。

  • awk 的用法 4:

awk -F: '/^ols3/{ print $3, $4 }' /etc/passwd 使用选项-F,指定:为分隔字符,账号 ols3 的 uid(第 3 字段)及 gid(第 4 字段)显示 出来。

awk 的用法 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 个字段,且彼此用 +++ 隔开。

实例应用

取得网卡的 IP:

 ifconfig | grep 'inet addr:' | grep Bcast | awk '{print $2}' | awk -F: '{print $2}' 

取得网络设备名称:

 cat /proc/net/dev | awk -F: '/eth.:|ppp.:|wlan.:/{print $1}'  

在本例中,-F:把分隔字符设为:,而且,采用多选一的样式 /eth.:|ppp.:|wlan.:/。这个样式 的意思是:设备名称可以是 eth0:、ppp1:、wlan1: 这 3 个其中之一。一旦找到符合样式的字 符串后,去掉:,取其中的第一个域值,因此,可能的答案是 eth0 或 ppp1 或 wlan1。

取得系统内存大小:

cat /proc/meminfo | awk '/MemTotal/{print $2}' 

/proc/meminfo 记载主机内存相关数据,其中 MemTotal 为内存大小,其样本值如下:

MemTotal: 223128 kB 

因此,在 awk 的样式语法中,利用/MemTotal/ 找到这一行,再印出第二个字段,即 可得到内存的大小。

发表评论

后才能评论