在awk程序中使用shell

awk学习笔记(6)中我们已经简单的了解了管道符的用途,本文会用更多的例子来详述awk中使用管道符来接收shell传递过来的数据的处理。

例子一:取得系统当前登录人数

编写count.awk文件:

 
  
  1. BEGIN { 
  2. while ( "who" | getline) n++ 
  3. print n  

执行:

 
  
  1. awk -f count.awk 

输出:

 
  
  1. 3

我当前开着两个命令行窗口,加上mac系统的登录数,刚好是3个

上面的程序也可以直接在命令行中写:

 
  
  1. awk 'BEGIN {while("who"|getline) n++;print n}' 

输出的结果是一样的。

解释:

who是shell命令,返回当前登录的记录;
getline一次取一行记录,成功就返回1,失败就返回-1;
n是变量,当成功读取了一条记录时就自加1;
while循环会遍历所有的登录记录;
最后print打印出总计数n到屏幕上。

例子二:取得当前目录的文件总数

 
  
  1. awk 'BEGIN {while("ls -a"|getline) n++;print n}' 

输出:

 
  
  1. 51 

这个例子跟上面的很像,只是shell命令带上了参数。

"ls -a"是列出当前目录下的所有文件,包含隐藏文件;
getline取一行记录,成功就返回1,失败返回-1;
n是计数变量;
while循环所有的记录;
print打印计数总数。