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

系统 Linux
我想在 Linux / 类Unix 系统上使用 awk 打印文件名。 如何使用 awk 的 BEGIN 特殊模式打印文件名? 我可以使用 gawk/awk 打印当前输入文件的名称吗?

[[224202]]

Q:我想在 Linux / 类Unix 系统上使用 awk 打印文件名。 如何使用 awk 的 BEGIN 特殊模式打印文件名? 我可以使用 gawk/awk 打印当前输入文件的名称吗?(LCTT 译注:读者***能有一些 awk 的背景知识,否则阅读本文的时候会有一些困惑)

FILENAME 变量中存放着当前输入文件的名称。 您可以使用 FILENAME 显示或打印当前输入文件名,如果在命令行中未指定文件,则 FILENAME 的值为 - (标准输入)(LCTT 译注:多次按下回车键即可看到效果)。 但是,除非由 getline 设置,否则 FILENAMEBEGIN 特殊模式中未定义。

 

使用 awk 打印文件名

使用语法如下:

  1. awk '{ print FILENAME }' fileNameHere
  2. awk '{ print FILENAME }' /etc/hosts

因 awk 逐行读取文件,因此,你可能看到多个文件名,为了避免这个情况,你可以使用如下的命令:(LCTT 译注:FNR 表示当前记录数,只在文件中有效)

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

 

使用 awk 的 BEGIN 特殊规则打印文件名

使用下面的语法:(LCTT 译注:ARGV[I] 表示输入的第 i 个参数)

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

示例输出:

  1. /etc/hosts

然而,ARGV[1] 并不是每一次都能奏效,例如:

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

你需要将它修改如下(假设 ls -l 只产生一行输出):

  1. ls -l /etc/hosts | awk '{ print "File: " $9 ", Owner:" $3 ", Group: " $4 }'

示例输出:

  1. File: /etc/hosts, Owner:root, Group: root

 

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

使用如下的示例语法:

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

示例输出:

  1. Starting...
  2. blkid.conf
  3. cryptconfig.conf
  4. dhclient6.conf
  5. dhclient.conf
  6. dracut.conf
  7. gai.conf
  8. gnome_defaults.conf
  9. host.conf
  10. idmapd.conf
  11. idnalias.conf
  12. idn.conf
  13. insserv.conf
  14. iscsid.conf
  15. krb5.conf
  16. ld.so.conf
  17. logrotate.conf
  18. mke2fs.conf
  19. mtools.conf
  20. netscsid.conf
  21. nfsmount.conf
  22. nscd.conf
  23. nsswitch.conf
  24. openct.conf
  25. opensc.conf
  26. request-key.conf
  27. resolv.conf
  28. rsyncd.conf
  29. sensors3.conf
  30. slp.conf
  31. smartd.conf
  32. sysctl.conf
  33. vconsole.conf
  34. warnquota.conf
  35. wodim.conf
  36. xattr.conf
  37. xinetd.conf
  38. yp.conf
  39. ....DONE

nextfile 告诉 awk 停止处理当前的输入文件。 下一个输入记录读取来自下一个输入文件。 更多信息,请参见 awk/gawk 命令手册页:

  1. man awk
  2. man gawk 
责任编辑:庞桂玉 来源: Linux中国
相关推荐

2009-06-29 09:57:05

Unix

2021-10-02 10:10:47

LinuxBusyBox命令

2017-05-03 15:30:38

LinuxMeld比较文件夹

2019-11-26 16:58:51

Linuxpkgsrc

2019-01-07 09:50:06

Linuxtarball命令

2023-01-17 07:40:59

LinuxAppImage应用程序

2019-09-16 11:40:49

Linux交换文件

2020-08-24 12:37:54

Linuxxargs命令

2022-11-10 15:17:43

Windows文件Linux

2010-05-11 10:29:06

Unix awk

2022-08-10 13:12:04

Linuxcat命令

2020-12-28 06:44:45

FedoraLinux RPM文件

2012-12-24 15:00:56

sis塞班

2019-06-10 08:15:52

Linux命令

2020-10-22 09:36:32

Ubuntu同步文件

2018-03-07 11:32:44

LinuxVundleVim

2018-04-25 10:46:05

Linux命令行日历

2018-08-06 09:30:00

LinuxPbcopyPbpaste

2022-09-19 08:45:52

Telnet系统Linux

2009-12-16 11:54:35

WindowsLinuxUnix
点赞
收藏

51CTO技术栈公众号