在Awk命令系列的前几部分中,小编主要介绍了了从文件读取输入,但如果你想从STDIN(标准输入)读取输入,应该怎么办呢?
在Awk系列本部分内容中,小编将探讨一些示例,展示如何使用Awk命令过滤其它命令的输出,而不是从文件中读取输入,一起来看看吧。
列出目录中用户拥有的文件
首先将从dir命令开始,它的工作方式与ls命令类似。在下面的示例中,使用dir -l
命令的输出作为awk的输入,以打印当前目录中文件所有者的用户名、组名及其拥有的文件:
dir -l | awk '{print $3, $4, $9;}'
列出root用户拥有的文件
接下来看看使用awk表达式的另一个例子,这里我们想通过使用一个表达式来过滤字符串,打印由root用户拥有的文件,如下面的awk命令所示:
dir -l | awk '$3=="root" {print $1,$3,$4, $9;} '
上述命令使用了(==)
比较运算符,帮助我们过滤出当前目录中由root用户拥有的文件,这是通过表达式$3==”root”
来实现的。
使用Awk比较运算符匹配字符串
现在让我们看另一个使用awk比较运算符来匹配某个字符串的例子。
在这里,使用cat命令来查看名为tecmint_deals.txt的文件的内容,并且我们只想查看“Tech”类型的交易,因此可以运行以下命令:
cat tecmint_deals.txt cat tecmint_deals.txt | awk '$4 ~ /tech/{print}' cat tecmint_deals.txt | awk '$4 ~ /Tech/{print}'
在上面的示例中,我们使用了值~ /pattern/
比较运算符,但还有两个命令可以用来强调一个非常重要的点。
- 当使用模式tech运行命令时,不会打印任何内容,因为没有该类型的交易,但使用Tech ,会得到Tech类型的交易。
因此,使用此比较运算符时要务必小心,正如我们上面看到的,它区分大小写。
总之不管怎样,你始终可以使用另一个命令的输出作为awk的输入,而不是只能从文件读取输入,这使用起来也非常简单,正如在上面的示例中所看到的那样。
过滤今天修改的文件
如果要过滤今天修改过的文件,则可以使用awk来提取并显示这些文件:
ls -l | awk '$6 == "Sep" && $7 == "22" {print $9}'
此命令过滤9月22日修改的文件。
统计特定类型的文件
要计算某个目录中的.txt
文件数量,请使用以下命令:
ls -l | awk '$9 ~ /\.txt$/ {count++} END {print count}'
从命令输出中提取特定字段
如果要从ps命令输出中提取特定字段,例如进程ID和命令名称:
ps aux | awk '{print $1, $2, $11}'
小结
希望以上这些例子能够让你了解从STDIN读取和过滤Awk输入的方法,这样就可以直接处理管道中的数据,从而不需要先保存到文件中,适合实时处理,最终能够快速过滤和处理数据。
此外,这种方法还可以处理不同命令的输出,便于将多个命令结合使用,实现复杂的数据处理,并且不需要额外的存储空间,尤其适合处理大数据集。这些优点使得在日常使用中,使用Awk从STDIN读取和过滤数据变得非常实用。