在這篇文章中,我們将會看一些 linux 中的過濾器指令行工具。過濾器是一個程式,它從标準輸入讀取資料,在資料上執行操作,然後把結果寫到标準輸出。
是以,它可以用來以強大的方式處理資訊,例如重新結構化輸出以生成有用的報告,修改檔案裡面的文本,以及其他很多系統管理任務。
下面是 linux 上的一些有用的檔案或者文本過濾器。
<a target="_blank"></a>
另外,也可以通過閱讀 awk 的 man 手冊來擷取更多的資訊和使用選項。
<code>$ man awk</code>
<a href="https://linux.cn/article-7161-1.html">如何使用 gnu sed 指令在 linux 下建立、編輯和處理檔案</a>
<a href="http://www.tecmint.com/linux-sed-command-tips-tricks/" target="_blank">日常 linux 系統管理者任務使用的 15 個有用的 sed 指令小貼士和技巧</a>
sed 的 man 手冊已經添加控制選項和說明:
<code>$ man sed</code>
這些過濾器輸出比對指定模式的行。它們從一個檔案或者标準輸入讀取行,并且輸出所有比對的行,預設輸出到标準輸出。
<code>$ egrep = grep -e</code>
<code>$ fgrep = grep -f</code>
<code>$ rgrep = grep -r</code>
下面是一些基本的 grep 指令:
<code>tecmint@tecmint ~ $ grep "aaronkilik" /etc/passwd</code>
<code>aaronkilik:x:1001:1001::/home/aaronkilik:</code>
<code>tecmint@tecmint ~ $ cat /etc/passwd | grep "aronkilik"</code>
head 用于顯示檔案前面的部分,預設情況下它輸出前 10 行。你可以使用 <code>-n</code> 标志來指定顯示的行數:
<code>tecmint@tecmint ~ $ head /var/log/auth.log</code>
<code>jan 2 10:45:01 tecmint cron[3383]: pam_unix(cron:session): session opened for user root by (uid=0)</code>
<code>jan 2 10:45:01 tecmint cron[3383]: pam_unix(cron:session): session closed for user root</code>
<code>jan 2 10:51:34 tecmint sudo: tecmint : tty=unknown ; pwd=/home/tecmint ; user=root ; command=/usr/lib/linuxmint/mintupdate/checkapt.py</code>
<code>jan 2 10:51:34 tecmint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)</code>
<code>jan 2 10:51:39 tecmint sudo: pam_unix(sudo:session): session closed for user root</code>
<code>jan 2 10:55:01 tecmint cron[4099]: pam_unix(cron:session): session opened for user root by (uid=0)</code>
<code>jan 2 10:55:01 tecmint cron[4099]: pam_unix(cron:session): session closed for user root</code>
<code>jan 2 11:05:01 tecmint cron[4138]: pam_unix(cron:session): session opened for user root by (uid=0)</code>
<code>jan 2 11:05:01 tecmint cron[4138]: pam_unix(cron:session): session closed for user root</code>
<code>jan 2 11:09:01 tecmint cron[4146]: pam_unix(cron:session): session opened for user root by (uid=0)</code>
<code>tecmint@tecmint ~ $ head -n 5 /var/log/auth.log</code>
tail 輸出一個檔案的後面的部分(預設 10 行)。使用 <code>-n</code> 選項來指定顯示的行數。
下面的指令将會輸出指定檔案的最後 5 行:
<code>tecmint@tecmint ~ $ tail -n 5 /var/log/auth.log</code>
<code>jan 6 13:01:27 tecmint sshd[1269]: server listening on 0.0.0.0 port 22.</code>
<code>jan 6 13:01:27 tecmint sshd[1269]: server listening on :: port 22.</code>
<code>jan 6 13:01:27 tecmint sshd[1269]: received sighup; restarting.</code>
下面的指令将會使你能夠監控指定檔案的變化:
<code>tecmint@tecmint ~ $ tail -f /var/log/auth.log</code>
<code>jan 6 12:58:01 tecmint sshd[1269]: server listening on :: port 22.</code>
<code>jan 6 12:58:11 tecmint sshd[1269]: received sighup; restarting.</code>
<code>jan 6 12:58:12 tecmint sshd[1269]: server listening on 0.0.0.0 port 22.</code>
<code>jan 6 12:58:12 tecmint sshd[1269]: server listening on :: port 22.</code>
閱讀 tail 的 man 手冊,擷取使用選項和說明的完整内容:
<code>$ man tail</code>
下面是一個名為 domain.list 的檔案的内容:
<code>tecmint@tecmint ~ $ cat domains.list</code>
<code>tecmint.com</code>
<code>news.tecmint.com</code>
<code>linuxsay.com</code>
<code>windowsmint.com</code>
<code>tecmint@tecmint ~ $ sort domains.list</code>
你可以有多種方式來使用 sort 指令,請參閱以下一些關于 sort 指令的有用的文章。
<a href="https://linux.cn/article-5372-1.html">linux 的 ‘sort’指令的14個有用的範例(一)</a>
<a href="https://linux.cn/article-5373-1.html">linux 的 'sort'指令的七個有趣執行個體(二)</a>
<a href="http://www.tecmint.com/find-and-sort-files-modification-date-and-time-in-linux/" target="_blank">如何基于修改日期和時間來查找和排序檔案</a>
在對一個輸入流運作 <code>sort</code> 之後,你可以使用 <code>uniq</code> 删除重複行,如下例所示。
為了顯示行出現的數目,使用 <code>-c</code> 選項,要在對比時忽略大小寫的差異,使用 <code>-i</code> 選項:
<code>tecmint@tecmint ~ $ sort domains.list | uniq -c</code>
<code>2 linuxsay.com</code>
<code>2 news.tecmint.com</code>
<code>2 tecmint.com</code>
<code>1 windowsmint.com</code>
通過閱讀 <code>uniq</code> 的 man 手冊來擷取進一步的使用資訊和選項:
<code>$ man uniq</code>
fmt 是一款簡單的優化的文本格式化器,它重新格式化指定檔案的段落,并且列印結果到标準輸出。
以下是從檔案 domain-list.txt 提取的内容:
<code>1.tecmint.com 2.news.tecmint.com 3.linuxsay.com 4.windowsmint.com</code>
為了把上面的内容重新格式化成一個标準的清單,運作下面的指令,使用 <code>-w</code> 選項定義最大行寬度:
<code>tecmint@tecmint ~ $ cat domain-list.txt</code>
<code>tecmint@tecmint ~ $ fmt -w 1 domain-list.txt</code>
<code>1.tecmint.com</code>
<code>2.news.tecmint.com</code>
<code>3.linuxsay.com</code>
<code>4.windowsmint.com</code>
pr 指令轉換文本檔案或者标準輸入之後列印出來。例如在 debian 系統上,你可以像下面這樣顯示所有的安裝包:
<code>$ dpkg -l</code>
為了将要列印的清單在頁面和列中組織好,使用以下指令。
<code>tecmint@tecmint ~ $ dpkg -l | pr --columns 3 -l 20</code>
<code>2017-01-06 13:19 page 1</code>
<code>desired=unknown/install ii adduser ii apg</code>
<code>| status=not/inst/conf- ii adwaita-icon-theme ii app-install-data</code>
<code>|/ err?=(none)/reinst-r ii adwaita-icon-theme- ii apparmor</code>
<code>||/ name ii alsa-base ii apt</code>
<code>+++-=================== ii alsa-utils ii apt-clone</code>
<code>ii accountsservice ii anacron ii apt-transport-https</code>
<code>ii acl ii apache2 ii apt-utils</code>
<code>ii acpi-support ii apache2-bin ii apt-xapian-index</code>
<code>ii acpid ii apache2-data ii aptdaemon</code>
<code>ii add-apt-key ii apache2-utils ii aptdaemon-data</code>
<code>2017-01-06 13:19 page 2</code>
<code>ii aptitude ii avahi-daemon ii bind9-host</code>
<code>ii aptitude-common ii avahi-utils ii binfmt-support</code>
<code>ii apturl ii aview ii binutils</code>
<code>ii apturl-common ii banshee ii bison</code>
<code>ii archdetect-deb ii baobab ii blt</code>
<code>ii aspell ii base-files ii blueberry</code>
<code>ii aspell-en ii base-passwd ii bluetooth</code>
<code>ii at-spi2-core ii bash ii bluez</code>
<code>ii attr ii bash-completion ii bluez-cups</code>
<code>ii avahi-autoipd ii bc ii bluez-obexd</code>
<code>.....</code>
其中,使用的标志如下:
<code>--column</code> 定義在輸出中建立的列數。
<code>-l</code> 指定頁面的長度(預設是 66 行)。
這個指令從标準輸入轉換或者删除字元,然後輸出結果到标準輸出。
使用 <code>tr</code> 的文法如下:
<code>$ tr options set1 set2</code>
看一下下面的例子,在第一個指令,<code>set1( [:upper:] )</code> 代表指定輸入字元的大小寫(都是大寫字元)。<code>set2([:lower:])</code> 代表期望結果字元的大小寫。第二個例子意思相似,轉義字元 <code>\n</code> 表示在新的一行列印輸出:
<code>tecmint@tecmint ~ $ echo "www.tecmint.com" | tr [:upper:] [:lower:]</code>
<code>www.tecmint.com</code>
<code>tecmint@tecmint ~ $ echo "news.tecmint.com" | tr [:lower:] [:upper:]</code>
你可以像這樣使用它來顯示大檔案:
<code>tecmint@tecmint ~ $ dmesg | more</code>
<code>[ 0.000000] initializing cgroup subsys cpuset</code>
<code>[ 0.000000] initializing cgroup subsys cpu</code>
<code>[ 0.000000] initializing cgroup subsys cpuacct</code>
<code>[ 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</code>
<code>4.4.6)</code>
<code>[ 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</code>
<code>[ 0.000000] kernel supported cpus:</code>
<code>[ 0.000000] intel genuineintel</code>
<code>[ 0.000000] amd authenticamd</code>
<code>[ 0.000000] centaur centaurhauls</code>
<code>[ 0.000000] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256</code>
<code>[ 0.000000] x86/fpu: supporting xsave feature 0x01: 'x87 floating point registers'</code>
<code>[ 0.000000] x86/fpu: supporting xsave feature 0x02: 'sse registers'</code>
<code>[ 0.000000] x86/fpu: supporting xsave feature 0x04: 'avx registers'</code>
<code>[ 0.000000] x86/fpu: enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.</code>
<code>[ 0.000000] x86/fpu: using 'eager' fpu context switches.</code>
<code>[ 0.000000] e820: bios-provided physical ram map:</code>
<code>[ 0.000000] bios-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable</code>
<code>[ 0.000000] bios-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved</code>
<code>[ 0.000000] bios-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved</code>
<code>[ 0.000000] bios-e820: [mem 0x0000000000100000-0x00000000a56affff] usable</code>
<code>[ 0.000000] bios-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved</code>
<code>[ 0.000000] bios-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable</code>
<code>--more--</code>
less 是和上面的 more 指令相反的一個指令,但是它提供了額外的特性,而且對于大檔案,它會更快些。
按照 <code>more</code> 指令相同的方式使用它:
<code>tecmint@tecmint ~ $ dmesg | less</code>
<code>:</code>
原文釋出時間為:2017-02-17
本文來自雲栖社群合作夥伴“linux中國”