例如,可以运用下列组合命令列出who命令显示结果中每一行的字段数(列数) goddog@ubuntu:~$ who | awk '{ print NF }' 5 我们可以运用who命令验证一下。从下面的显示结果可知awk命令是将空白符号当作字段的分隔符的: goddog@ubuntu:~$ who goddog tty7 2017-04-22 13:37 (:0) 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编程的复杂程度。 |