Awk的用法
awk 也是一个非常棒的数据处理工具!相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个『字段』来处理.因此,awk 相当的适合处理小型的数据数据处理呢!awk 通常运作的模式是这样的:
[root@www ~]# awk ''条件类型1{动作1} 条件类型2{动作2} ...'' filename |
awk 后面接两个单引号并加上大括号 {} 来设定想要对数据进行的处理动作. awk 可以处理后续接的档案,也可以读取来自前个指令的 standard output . 但如前面说的, awk 主要是处理『每一行的字段内的数据』,而预设的『字段的分隔符为 "空格键" 或 "[tab]键" 』!举例来说,我们用 last 可以将登入者的数据取出来,结果如下所示:
[root@www ~]# last -n 5 <==仅取出前五行
root pts/1 192.168.1.100 Tue Feb 10 11:21 still logged in
root pts/1 192.168.1.100 Tue Feb 10 00:46 - 02:28 (01:41)
root pts/1 192.168.1.100 Mon Feb 9 11:41 - 18:30 (06:48)
dmtsai pts/1 192.168.1.100 Mon Feb 9 11:41 - 11:41 (00:00)
root tty1 Fri Sep 5 14:09 - 14:10 (00:01) |
若我想要取出账号与登入者的 IP ,且账号与 IP 之间以 [tab] 隔开,则会变成这样:
[root@www ~]# last -n 5 | awk ''{print $1 "\t" $3}''
root 192.168.1.100
root 192.168.1.100
root 192.168.1.100
dmtsai 192.168.1.100
root Fri |
上表是 awk 最常使用的动作!透过 print 的功能将字段数据列出来!字段的分隔则以空格键或 [tab] 按键来隔开. 不论哪一行我都要处理,因此,就不需要有 "条件类型" 的限制!我所想要的是第一栏以及第三栏, 但是,第五行的内容怪怪的~这是数据格式的问题啊!啰~使用 awk 的时候,请先确认一下你的数据当中,如果是连续性的数据,请不要有空格或 [tab] 在内,否则,就会像这个例子这样,会发生误判喔!
另外,由上面这个例子你也会知道,在每一行的每个字段都是有变量名称的,那就是 $1, $2... 等变量名称.以上面的例子来说, root 是 $1 ,他是第一栏嘛!至于 192.168.1.100 是第三栏, 他就是 $3 啦!后面以此类推~呵呵!还有个变数喔!那就是 $0 ,$0 代表『一整列资料』的意思~以上面的例子来说,第一行的 $0 代表的就是『root .... 』那一行啊! 由此可知,刚刚上面五行当中,整个 awk 的处理流程是:
1. 读入第一行,并将第一行的资料填入 $0, $1, $2.... 等变数当中;
2. 依据 "条件类型" 的限制,判断是否需要进行后面的 "动作";
3. 做完所有的动作与条件类型;
4. 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止.
经过这样的步骤,你会晓得, awk 是『以行为一次处理的单位』, 而『以字段为最小的处理单位』.好了,那么 awk 怎么知道我到底这个数据有几行?有几栏呢?这就需要 awk 的内建变量的帮忙啦~
变量名称 |
代表意义 |
NF |
每一行 ($0) 拥有的字段总数 |
NR |
目前 awk 所处理的是『第几行』数据 |
FS |
目前的分隔字符,预设是空格键 |
我们继续以上面 last -n 5 的例子来做说明,如果我想要:
- 列出每一行的账号(就是 $1);
- 列出目前处理的行数(就是 awk 内的 NR 变量)
- 并且说明,该行有多少字段(就是 awk 内的 NF 变量)
则可以这样:
Tips: 要注意喔,awk 后续的所有动作是以单引号『 '' 』括住的,单引号与双引号都是成对的, , awk 的格式内容如果想要以 print 打印时,记得非变量的文字部分,包含上一小节 printf 提到的格式中,都需要使用双引号来定义出来喔!单引号已经是 awk 的指令固定用法了! |
|
[root@www ~]# last -n 5| awk ''{print $1 "\t lines: " NR "\t columns: " NF}''
root lines: 1 columns: 10
root lines: 2 columns: 10
root lines: 3 columns: 10
dmtsai lines: 4 columns: 10
root lines: 5 columns: 9
# 注意喔,在 awk 内的 NR, NF 等变量要用大写,且不需要有钱字号 $ 啦! |
|