首頁 > 軟體

Linux下過濾文字、實現高效檔案操作的12個實用命令

2020-06-16 17:23:44

我們在本文中介紹了多款在Linux下充當過濾器的命令列工具。過濾器是這樣一種程式:讀取標准輸入後,對它執行操作,然後將結果寫入到標準輸出。

過濾器工具以有效的方式處理資訊,比如重構輸出以生成實用報告,修改檔案中的文字,以及處理其他許多系統管理任務。

言歸正傳,下面介紹幾款Linux環境下實用的檔案或文字過濾器。

1.Awk命令

Awk是一種出色的模式掃描和處理語言,它可以用來在Linux下構建實用過濾器。

可以參閱awk的參考手冊頁,了解更多資訊和用法選項:

  1. $ man awk 

Linux常用命令之awk http://www.linuxidc.com/Linux/2016-09/135046.htm

Linux系統之文字格式化工具awk http://www.linuxidc.com/Linux/2016-02/128150.htm

AWK簡介及使用範例 http://www.linuxidc.com/Linux/2013-12/93519.htm

Linux awk文字分析工具 http://www.linuxidc.com/Linux/2015-12/126217.htm

Linux文字處理工具之awk  http://www.linuxidc.com/Linux/2015-01/111437.htm

如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm

文字分析工具-awk  http://www.linuxidc.com/Linux/2014-12/110939.htm

AWK入門基礎教學  http://www.linuxidc.com/Linux/2016-12/138138.htm

使用awk格式化輸出文字 http://www.linuxidc.com/Linux/2016-04/130193.htm

2.Sed命令

sed是一種強大的流編輯器,可用於過濾和轉換文字。

sed的參考手冊頁新增了控制選項和操作說明:

  1. $ man sed 

在sed命令中引入shell變數 http://www.linuxidc.com/Linux/2014-03/97896.htm

Linux下Shell程式設計——sed命令基本用法 http://www.linuxidc.com/Linux/2013-06/85526.htm

Unix文字處理工具之sed  http://www.linuxidc.com/Linux/2013-08/89315.htm

sed 高階用法 http://www.linuxidc.com/Linux/2014-09/106961.htm

sed命令詳解與範例 http://www.linuxidc.com/Linux/2014-11/109325.htm

Linux正規表示式sed 詳述  http://www.linuxidc.com/Linux/2015-04/116309.htm

Linux常用命令:sed http://www.linuxidc.com/Linux/2016-10/136197.htm

Linux文字處理工具之sed  http://www.linuxidc.com/Linux/2015-01/111436.htm

3.Grep、Egrep、Fgrep和Rgrep命令

這些過濾器輸出與特定模式匹配的行。它們從檔案或標準輸入讀取行,預設情況下將所有匹配的行列印輸出到標準輸出。

注意:主程式是grep,幾個變種與使用特定的grep選項完全一樣(它們仍可用於向後相容):

  1. $ egrep = grep -E 
  2. $ fgrep = grep -F 
  3. $ rgrep = grep -r  

下面是一些基本的grep命令:

  1. linuxidc@linuxidc ~ $ grep "aaronkilik" /etc/passwd 
  2. aaronkilik:x:1001:1001::/home/aaronkilik: 
  3. linuxidc@linuxidc ~ $ cat /etc/passwd | grep "aronkilik" 
  4. aaronkilik:x:1001:1001::/home/aaronkilik:  

grep使用簡明及正規表示式  http://www.linuxidc.com/Linux/2013-08/88534.htm

Linux下Shell程式設計——grep命令的基本運用 http://www.linuxidc.com/Linux/2013-06/85525.htm

grep 命令詳解及相關事例 http://www.linuxidc.com/Linux/2014-07/104041.htm

Linux基礎命令之grep詳解 http://www.linuxidc.com/Linux/2013-07/87919.htm

設定grep高亮顯示匹配項 http://www.linuxidc.com/Linux/2014-09/106871.htm

Linux grep命令學習與總結 http://www.linuxidc.com/Linux/2014-10/108112.htm

14 個 grep 命令的例子 http://www.linuxidc.com/Linux/2015-05/117626.htm

4.head命令

head用於顯示檔案的最初部分,預設情況下輸出頭10行。你可以使用-n num標誌,指定顯示的行數:

  1. linuxidc@linuxidc ~ $ head /var/log/auth.log   
  2. Jan  2 10:45:01 linuxidc CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0) 
  3. Jan  2 10:45:01 linuxidc CRON[3383]: pam_unix(cron:session): session closed for user root 
  4. Jan  2 10:51:34 linuxidc sudo:  linuxidc : TTY=unknown ; PWD=/home/linuxidc ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py 
  5. Jan  2 10:51:34 linuxidc sudo: pam_unix(sudo:session): session opened for user root by (uid=0) 
  6. Jan  2 10:51:39 linuxidc sudo: pam_unix(sudo:session): session closed for user root 
  7. Jan  2 10:55:01 linuxidc CRON[4099]: pam_unix(cron:session): session opened for user root by (uid=0) 
  8. Jan  2 10:55:01 linuxidc CRON[4099]: pam_unix(cron:session): session closed for user root 
  9. Jan  2 11:05:01 linuxidc CRON[4138]: pam_unix(cron:session): session opened for user root by (uid=0) 
  10. Jan  2 11:05:01 linuxidc CRON[4138]: pam_unix(cron:session): session closed for user root 
  11. Jan  2 11:09:01 linuxidc CRON[4146]: pam_unix(cron:session): session opened for user root by (uid=0) 
  12. linuxidc@linuxidc ~ $ head  -n 5 /var/log/auth.log   
  13. Jan  2 10:45:01 linuxidc CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0) 
  14. Jan  2 10:45:01 linuxidc CRON[3383]: pam_unix(cron:session): session closed for user root 
  15. Jan  2 10:51:34 linuxidc sudo:  linuxidc : TTY=unknown ; PWD=/home/linuxidc ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py 
  16. Jan  2 10:51:34 linuxidc sudo: pam_unix(sudo:session): session opened for user root by (uid=0) 
  17. Jan  2 10:51:39 linuxidc sudo: pam_unix(sudo:session): session closed for user root  

5.tail命令

tail輸出檔案的末尾部分(預設情況下是末尾10行)。使用-n num引數選項符,即可指定顯示的行數。

下面這個命令會輸出指定檔案的末尾5行:

  1. linuxidc@linuxidc ~ $ tail -n 5 /var/log/auth.log 
  2. Jan  6 13:01:27 linuxidc sshd[1269]: Server listening on 0.0.0.0 port 22. 
  3. Jan  6 13:01:27 linuxidc sshd[1269]: Server listening on :: port 22. 
  4. Jan  6 13:01:27 linuxidc sshd[1269]: Received SIGHUP; restarting. 
  5. Jan  6 13:01:27 linuxidc sshd[1269]: Server listening on 0.0.0.0 port 22. 
  6. Jan  6 13:01:27 linuxidc sshd[1269]: Server listening on :: port 22.  

此外,tail有一個特殊的選項-f,可用於實時檢視檔案(尤其是紀錄檔檔案)的變化。

下面這個命令讓你能夠密切關注指定檔案的變化:

  1. linuxidc@linuxidc ~ $ tail -f /var/log/auth.log 
  2. Jan  6 12:58:01 linuxidc sshd[1269]: Server listening on :: port 22. 
  3. Jan  6 12:58:11 linuxidc sshd[1269]: Received SIGHUP; restarting. 
  4. Jan  6 12:58:12 linuxidc sshd[1269]: Server listening on 0.0.0.0 port 22. 
  5. Jan  6 12:58:12 linuxidc sshd[1269]: Server listening on :: port 22. 
  6. Jan  6 13:01:27 linuxidc sshd[1269]: Received SIGHUP; restarting. 
  7. Jan  6 13:01:27 linuxidc sshd[1269]: Server listening on 0.0.0.0 port 22. 
  8. Jan  6 13:01:27 linuxidc sshd[1269]: Server listening on :: port 22. 
  9. Jan  6 13:01:27 linuxidc sshd[1269]: Received SIGHUP; restarting. 
  10. Jan  6 13:01:27 linuxidc sshd[1269]: Server listening on 0.0.0.0 port 22. 
  11. Jan  6 13:01:27 linuxidc sshd[1269]: Server listening on :: port 22.  

參閱tail的參考手冊頁,即可了解完整的用法選項和操作說明:

  1. $ man tail 

6.sort命令

sort用於排序文字檔案的行或來自標準輸入的行。

下面是一個名為domains.list的檔案的內容:

  1. linuxidc@linuxidc ~ $ cat domains.list 
  2. linuxidc.com 
  3. linuxidc.com 
  4. news.linuxidc.com 
  5. news.linuxidc.com 
  6. linuxsay.com 
  7. linuxsay.com 
  8. windowsmint.com 
  9. windowsmint.com  

你可以執行簡單的sort命令,排序檔案內容,就像這樣:

  1. linuxidc@linuxidc ~ $ sort domains.list 
  2. linuxsay.com 
  3. linuxsay.com 
  4. news.linuxidc.com 
  5. news.linuxidc.com 
  6. linuxidc.com 
  7. linuxidc.com 
  8. windowsmint.com 
  9. windowsmint.com  

使用sort命令有好多方式,我們編寫了幾篇實用文章來介紹sort命令,如下所示:

Linux中的sort命令  http://www.linuxidc.com/Linux/2016-08/134626.htm

Linux Sort命令的七個有趣範例(二) http://www.linuxidc.com/Linux/2015-05/116997.htm

7.uniq命令

uniq命令用於報告或忽略重複的行,它可以過濾來自標準輸入的行,並將結果寫入到標準輸出。

對輸入流執行sort後,可以用uniq來消除重複的行,如下面這個例子所示。

為了表明某行出現的次數,可使用-c選項,忽視大小寫區別,同時通過加入-i選項來比較:

  1. linuxidc@linuxidc ~ $ cat domains.list 
  2. linuxidc.com 
  3. linuxidc.com 
  4. news.linuxidc.com 
  5. news.linuxidc.com 
  6. linuxsay.com 
  7. linuxsay.com 
  8. windowsmint.com 
  9. sort domains.list | uniq -c 
  10. 2 linuxsay.com 
  11. 2 news.linuxidc.com 
  12. 2 linuxidc.com 
  13. 1 windowsmint.com   

閱讀uniq的參考手冊頁,可進一步了解用法資訊和標誌:

  1. $ man uniq 

8.fmt命令

fmt是簡單的最佳文字格式器,它可以重新格式化指定檔案中的段落,並將結果列印輸出到標準輸出。

下面是從檔案domain-list.txt提取的內容:

1.linuxidc.com 2.news.linuxidc.com 3.linuxsay.com 4.windowsmint.com

要將上述內容重新格式化成標準列表,執行下面這個命令,-w引數選項符用來定義最大行寬:

  1. linuxidc@linuxidc ~ $ cat domain-list.txt 
  2. 1.linuxidc.com 2.news.linuxidc.com 3.linuxsay.com 4.windowsmint.com 
  3. linuxidc@linuxidc ~ $ fmt -w 1 domain-list.txt 
  4. 1.linuxidc.com 
  5. 2.news.linuxidc.com 
  6. 3.linuxsay.com 
  7. 4.windowsmint.com  

9.pr命令

pr命令可轉換文字檔案或標準輸入,以便列印輸出。比如在Debian系統上,你可以列出所有已安裝的程式包,如下所示:

  1. $ dpkg -l 

想組織整理分成頁和列的列表、準備列印輸出,執行下面這個命令。

  1. linuxidc@linuxidc ~ $ dpkg -l | pr --columns 3 -l 20   
  2. 2017-01-06 13:19                               
  3.           Page 1 
  4. Desired=Unknown/Install  ii  adduser            ii  apg 
  5. | Status=Not/Inst/Conf-   ii  adwaita-icon-theme    ii  app-install-data 
  6. |/ Err?=(none)/Reinst-r    ii  adwaita-icon-theme-  ii  apparmor 
  7. ||/ Name          ii  alsa-base         ii  apt 
  8. +++-=============== ii  alsa-utils              ii  apt-clone 
  9. ii  accountsservice       ii  anacron               ii  apt-transport-https 
  10. ii  acl               ii  apache2               ii  apt-utils 
  11. ii  acpi-support        ii  apache2-bin         ii  apt-xapian-index 
  12. ii  acpid                 ii  apache2-data          ii  aptdaemon 
  13. ii  add-apt-key       ii  apache2-utils         ii  aptdaemon-data 
  14. 2017-01-06 13:19                                   
  15.            Page 2 
  16. ii  aptitude              ii  avahi-daemon      ii  bind9-host 
  17. ii  aptitude-common   ii  avahi-utils           ii  binfmt-support 
  18. ii  apturl                ii  aview             ii  binutils 
  19. ii  apturl-common         ii  banshee               ii  bison 
  20. ii  archdetect-deb       ii  baobab             ii  blt 
  21. ii  aspell                ii  base-files            ii  blueberry 
  22. ii  aspell-en             ii  base-passwd           ii  bluetooth 
  23. ii  at-spi2-core          ii  bash              ii  bluez 
  24. ii  attr                  ii  bash-completion       ii  bluez-cups 
  25. ii  avahi-autoipd         ii  bc                    ii  bluez-obexd 
  26. .....  

這裡使用的標誌如下:

--column定義輸出中建立的列數。

-l 指定頁長(預設頁長是66行)。

10.tr命令

這個工具可轉換或刪除來自標準輸入的字元,並將結果寫入到標準輸出。

使用tr的語法如下:

  1. $ tr options set1 set2 

不妨看一看下面的例子,在第一個命令中,set1([:upper:])表示輸入字元的大小寫(全是大寫)。

然後,set2([:lower:])表示隨後得到的字元會是小寫。第二個例子中一樣,換碼順序n意味著列印輸出到新行上:

  1. linuxidc@linuxidc ~ $ echo "WWW.linuxidc.COM" | tr [:upper:] [:lower:] 
  2. www.linuxidc.com 
  3. linuxidc@linuxidc ~ $ echo "news.linuxidc.com" | tr [:lower:] [:upper:] 
  4. NEWS.linuxidc.COM  

11.more命令

more命令是一個實用的檔案閱讀過濾器,基本上是用於檢視證書而建立的。它顯示了頁面格式的檔案內容,使用者可以按確認鍵來檢視更多資訊。

你可以用它檢視更廣龐大的檔案,就像這樣:

  1. linuxidc@linuxidc ~ $ dmesg | more 
  2. [    0.000000] Initializing cgroup subsys cpuset 
  3. [    0.000000] Initializing cgroup subsys cpu 
  4. [    0.000000] Initializing cgroup subsys cpuacct 
  5. [    0.000000] Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic 
  6. 4.4.6) 
  7. [    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7 
  8. [    0.000000] KERNEL supported cpus: 
  9. [    0.000000]   Intel GenuineIntel 
  10. [    0.000000]   AMD AuthenticAMD 
  11. [    0.000000]   Centaur CentaurHauls 
  12. [    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256 
  13. [    0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers' 
  14. [    0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers' 
  15. [    0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers' 
  16. [    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format. 
  17. [    0.000000] x86/fpu: Using 'eager' FPU context switches. 
  18. [    0.000000] e820: BIOS-provided physical RAM map: 
  19. [    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable 
  20. [    0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved 
  21. [    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved 
  22. [    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable 
  23. [    0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved 
  24. [    0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable 
  25. --More-- 

12.less命令

less的用途與上面的more命令恰好相反,不過它提供了額外的功能,處理大檔案時要快一點。

可以與more同樣的方式來使用它:

  1. linuxidc@linuxidc ~ $ dmesg | less 
  2. [    0.000000] Initializing cgroup subsys cpuset 
  3. [    0.000000] Initializing cgroup subsys cpu 
  4. [    0.000000] Initializing cgroup subsys cpuacct 
  5. [    0.000000] Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic 
  6. 4.4.6) 
  7. [    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7 
  8. [    0.000000] KERNEL supported cpus: 
  9. [    0.000000]   Intel GenuineIntel 
  10. [    0.000000]   AMD AuthenticAMD 
  11. [    0.000000]   Centaur CentaurHauls 
  12. [    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256 
  13. [    0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers' 
  14. [    0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers' 
  15. [    0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers' 
  16. [    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format. 
  17. [    0.000000] x86/fpu: Using 'eager' FPU context switches. 
  18. [    0.000000] e820: BIOS-provided physical RAM map: 
  19. [    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable 
  20. [    0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved 
  21. [    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved 
  22. [    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable 
  23. [    0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved 
  24. [    0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable 

要是還有哪些在Linux下可充當文字過濾器的實用命令列工具是本文沒有提及的,歡迎留言補充。

原文標題:12 Useful Commands For Filtering Text for Effective File Operations in Linux,作者:Aaron Kili

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-01/139510.htm


IT145.com E-mail:sddin#qq.com