当前位置: 首页 > 科技观察

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

时间:2023-03-20 20:26:53 科技观察

问:我想在Linux/Unix-like系统上使用awk打印文件名。如何使用awk的BEGIN特殊模式打印文件名?我可以使用gawk/awk打印当前输入文件的名称吗?(LCTT译注:读者必须具备一定的awk背景知识,否则阅读本文时会有些混乱)当前输入文件的名称存储在FILENAME变量中。您可以使用FILENAME来显示或打印当前输入的文件名。如果没有在命令行上指定文件,FILENAME将为-(标准输入)。但是,FILENAME在BEGIN特殊模式下未定义,除非由getline设置。要使用awk打印文件名,请使用以下语法:awk'{printFILENAME}'fileNameHereawk'{printFILENAME}'/etc/hosts因为awk逐行读取文件,因此,您可能会看到多个文件名,以避免这种情况在其他情况下,可以使用如下命令:(LCTT译注:FNR表示当前记录数,只在文件中有效)awk'FNR==1{printFILENAME}'/etc/passwdawk'FNR==1{printFILENAME}'/etc/hosts使用awk的BEGIN特殊规则使用以下语法打印文件名:(LCTT注释:ARGV[I]表示输入的第i个参数)awk'BEGIN{printARGV[1]}'fileNameHereawk'BEGIN{printARGV[1]}{print"sometingordosomethingondata"}END{}'fileNameHereawk'BEGIN{printARGV[1]}'/etc/hosts示例输出:/etc/hosts然而,ARGV[1]并不是每次都起作用,例如:ls-l/etc/hosts|awk'BEGIN{printARGV[1]}{print}'你需要修改如下(假设ls-l只产生一行输出):ls-l/etc/hosts|awk'{print"File:"$9",Owner:"$3",Group:"$4}'Exampleoutput:File:/etc/hosts,Owner:root,Group:rootProcessedbyMultiplefilenamesspecifiedbywildcards使用以下示例语法:awk'{printFILENAME;nextfile}'*.cawk'BEGIN{print"Starting..."}{printFILENAME;nextfile}END{print"....DONE"}'*.conf样本输出:开始。..blkid.confcryptconfig.confdhclient6.confdhclient.confdracut.confgai.confgnome_defaults.confhost.confidmapd.confidnalias.confidn.confinsserv.confiscsid.confkrb5.confld.so.conflogrotate.confmke2fs.confmtools.confnetscsid.confnfsmount.confnscd.confnsswitch.confopenct。confopensc.confrequest-key.confresolv.confrsyncd.confsensors3.confslp.confsmartd.confsysctl.confvconsole.confwarnquota.confwodim.confxattr.confxinetd.confyp.conf....DONEnextfile告诉awk停止处理当前输入文件并读取下一个输入从下一个输入文件开始记录。有关详细信息,请参阅awk/gawk命令手册页:manawkmangawk