歡迎光臨
每天分享高質量文章

如何在 Linux / Unix 上使用 awk 打印檔案名 | Linux 中國

我想在 Linux / 類Unix 系統上使用 awk 打印檔案名。 如何使用 awk 的 BEGIN 特殊樣式打印檔案名?
— Vivek Gite


致謝
編譯自 | https://www.cyberciti.biz/faq/how-to-print-filename-with-awk-on-linux-unix/ 
 作者 | Vivek Gite
 譯者 | amwps290 ? ? 共計翻譯:10 篇 貢獻時間:51 天

Q:我想在 Linux / 類Unix 系統上使用 awk 打印檔案名。 如何使用 awk 的 BEGIN 特殊樣式打印檔案名? 我可以使用 gawk/awk 打印當前輸入檔案的名稱嗎?(LCTT 譯註:讀者最好能有一些 awk 的背景知識,否則閱讀本文的時候會有一些困惑)

在 FILENAME 變數中存放著當前輸入檔案的名稱。 您可以使用 FILENAME 顯示或打印當前輸入檔案名,如果在命令列中未指定檔案,則 FILENAME 的值為 - (標準輸入)(LCTT 譯註:多次按下回車鍵即可看到效果)。 但是,除非由 getline 設置,否則 FILENAME 在 BEGIN 特殊樣式中未定義。

使用 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] 命令手冊頁:

  1. man awk

  2. man gawk

關於作者

作者是 nixCraft 的創立者,也是經驗豐富的系統管理員和 Linux/Unix shell 腳本的培訓師。 他曾與全球各行各業的客戶合作,涉及 IT,教育,國防和空間研究以及非營利部門等多個行業。 您可以在 Twitter[2]Facebook[3] 和 Google+[4]上關註他。 可以通過訂閱我的 RSS[5]來獲取更多的關於系統管理,Linux/Unix ,和開源主題的相關資料。


via: https://www.cyberciti.biz/faq/how-to-print-filename-with-awk-on-linux-unix/

作者:Vivek Gite[7] 譯者:amwps290 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

赞(0)

分享創造快樂