如何在Linux/Unix上使用awk打印文件名

时间:2020-01-09 10:39:33  来源:igfitidea点击:

如何在类似Linux/Unix的系统上使用awk打印文件名。
如何在awk的BEGIN部分中打印文件名?
我可以使用gawk/awk打印当前输入文件的名称吗?
在FILENAME变量中设置的当前输入文件的名称。
您可以使用FILENAME来显示或打印当前的输入文件名。
如果在命令行上未指定文件,则FILENAME的值为-(stdin)。
但是,除非由getline设置,否则在BEGIN规则中未定义FILENAME。

如何使用awk打印文件名

语法为:

awk '{ print FILENAME }' fileNameHere
awk '{ print FILENAME }' /etc/hosts

您可能会逐行awk读取文件,多次看到文件名。
为避免此问题,请如下更新awk/gawk语法:

awk 'FNR == 1{ print FILENAME } ' /etc/passwd
awk 'FNR == 1{ print FILENAME } ' /etc/hosts

如何在awk的BEGIN部分中打印文件名

使用以下语法:

awk 'BEGIN{print ARGV[1]}' fileNameHere
awk 'BEGIN{print ARGV[1]}{ print "someting or do something on data" }END{}' fileNameHere
awk 'BEGIN{print ARGV[1]}' /etc/hosts

输出示例:

/etc/hosts

但是,ARGV [1]可能并不总是有效。
例如:

ls -l /etc/hosts | awk 'BEGIN{print ARGV[1]} { print }'

因此,您需要对其进行如下修改(假设ls -l仅产生一行输出):

ls -l /etc/hosts | awk '{ print "File: "  ", Owner:"  ", Group: "  }'

输出示例:

File: /etc/hosts, Owner:root, Group: roo

如何处理通配符指定的多个文件名

使用以下简单语法:

awk '{ print FILENAME; nextfile } ' *.c
awk 'BEGIN{ print "Starting..."} { print FILENAME; nextfile }END{ print "....DONE"} ' *.conf

nextfile告诉awk停止处理当前输入文件。
读取的下一个输入记录来自下一个输入文件。