awk 工具简介NF-NR

相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个『字段』来处理。 因此,awk 相当的适合处理小型的数据数据处理呢!awk 通常运作的模式是这样的:
[root@linux ~]# awk '条件类型1{动作1} 条件类型2{动作2} ...' filename awk 可以处理后续接的档案,也可以读取来自前个指令的 standard output 。 但如前面说的, awk 主要是处理『每一行的字段内的数据』,而预设的『字段的分隔符为 "空格键" 或 "[tab]键" 』!举例来说,我们用 last 可以将登入者的数据取出来, 结果如下所示:

若我想要取出账号与登入者的 IP ,且账号与 IP 之间以 [tab] 隔开,则会变成这样:

[root@linux ~]# last | awk '{print $1 "	" $3}'
dmtsai  192.168.1.12
root    Mon
reboot  boot
dmtsai  192.168.1.12

因为不论哪一行我都要处理,因此,就不需要有 "条件类型" 的限制!我所想要的是第一栏以及第三栏, 但是,第二行及第三行的内容怪怪的~这是因为数据格式的问题!所以~使用 awk 的时候,请先确认一下您的数据当中,如果是连续性的数据,请不要有空格或 [tab] 在内,否则,就会像这个例子这样,会发生误判!
另外,由上面这个例子您也会知道,在每一行的每个字段都是有变量名称的,那就是 $1, $2... 等变量名称,以上面的例子来说, dmtsai 是 $1 ,因为他是第一栏!至于 192.168.1.12 是第三栏, 所以他就是 $3 !后面以此类推~呵呵!还有个变数!那就是 $0 ,$0 代表『一整列资料』的意思~ 以上面的例子来说,第一行的 $0 代表的就是『dmtsai pts/0.... 』那一行! 由此可知,刚刚上面四行当中,整个 awk 的处理流程是: 

    • 入第一行,并将第一行的资料填入 $0, $1, $2.... 等变数当中; 
    • 依据 "条件类型" 的限制,判断是否需要进行后面的 "动作"; 
    • 做完所有的动作与条件类型; 
    • 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。经过这样的步骤, awk 是『以行为一次处理的单位』, 而『以字段为最小的处理单位』。好了,那么 awk 怎么知道我到底这个数据有几行?有几栏呢?这就需要 awk 的内建变量的帮忙~
      变量名称
      代表意义
      NF
      每一行 ($0) 拥有的字段总数
      NR
      目前 awk 所处理的是『第几行』数据
      FS
      目前的分隔字符,预设是空格键
      我们继续以上面例子来做说明,如果我想要列出每一行的账号,并且列出目前处理的行数, 并且说明,该行有多少字段,则可以这样 (注意, awk 后续的所有动作以 ' 括住, 所以,内容如果想要以 print 打印时,记得,非变量的文字部分,包含上一小节 
      printf
      提到的格式中,都需要使用双引号来定义出来!)
root@linux ~]# last | awk '{print $1 "	 lines: " NR "	 columes: " NF}'
dmtsai   lines: 1        columes: 10
root     lines: 2        columes: 9
reboot   lines: 3        columes: 9
dmtsai   lines: 4        columes: 10

这样可以了解 NR 与 NF 的差别了吧?好了,底下来谈一谈所谓的 "条件类型" 了吧!

原文地址:https://www.cnblogs.com/nb-blog/p/5285340.html