為了方便awk編程,awk中還引入了一個叫NF的變量。如果在命令表達式中使用沒有$符號的NF變量,這個變量將顯示一行記錄中有多少個字段。如果使用帶有$符號的NF變量,這個變量將顯示一行記錄中最後一個字段。
例如,可以使用下列組合命令列出who命令顯示結果中每一行的字段數(列數)
goddog@ubuntu:~$ who | awk '{ print NF }'
5
我們可以使用who命令驗證一下。從下面的顯示結果可知awk命令是將空白符號當作字段的分隔符的:
goddog@ubuntu:~$ who
goddog tty7 2017-04-22 13:37 (:0)
如果在第1個例子中的NF之前加上$符號,結果會怎麼樣呢?
goddog@ubuntu:~$ who | awk '{ print $NF }'
(:0)
結果顯示確實已經變成了who命令結果的最後一個字段。還記得昨天分享的“知道哪些用戶在登錄時使用的shell是存放在/bin目錄中以及這個shell的名字”的例子,可以利用NF變量完成相似的工作。在這個組合命令中,egrep命令從/etc/passwd文件中抽取包含bin或sbin的數據行,之後將grep命令的結果通過管道送給awk命令。awk命令把冒號看成字段的分隔符並將列出每一行的最後一個字段。之後再將awk命令的結果通過管道送給sort命令進行排序並繼續後面的操作。注意:命令的最後要加上| sort -n,才能按數字排序:
goddog@ubuntu:~$ egrep 'bin|sbin' /etc/passwd | awk -F: '{ print $NF }' | sort | uniq -c | sort -n
1 /bin/sync
2 /bin/bash
16 /usr/sbin/nologin
23 /bin/false
與NF變量相似,awk命令還引入了另一個變量NR,這個變量用來追蹤所顯示的數據行的數目,即顯示數據行的編號。因此,可以利用NR變量使用下列命令獲取root加目錄下wolf子目錄中的文件總數併為每個文件和目錄編號:
root@promote:~# ls -l ~/wolf | awk '{ print NR": "$0}'
1: 總用量 8
2: -rw-r--r-- 1 root root 84 1月 23 21:47 delete_disable
3: -rw-r--r-- 1 root root 0 1月 23 21:41 disable_babygirl.wolf
在下例中使用了$0變量,即第0個字段,在這裡$0變量表示整個數據行。現在想列出目前系統上的所有用戶並想在每個記錄的最前面顯示這個用戶登錄Linux系統所使用的計算機,命令如下:
goddog@ubuntu:~$ who | awk '{ print $6": "$0}'
: goddog tty7 2017-04-22 13:37 (:0)
巧妙地使用NF、NR、$0變量可以大大減小shell編程的複雜程度。
今天就分享這麼多了,謝謝欣賞!^o^