溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何正確的使用Shell過濾器

發(fā)布時(shí)間:2021-03-01 16:37:32 來源:億速云 閱讀:153 作者:Leah 欄目:開發(fā)技術(shù)

如何正確的使用Shell過濾器?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

常用的被作為過濾器使用的命令如下所示:

命令說明
awk用于文本處理的解釋性程序設(shè)計(jì)語(yǔ)言,通常被作為數(shù)據(jù)提取和報(bào)告的工具。
cut用于將每個(gè)輸入文件(如果沒有指定文件則為標(biāo)準(zhǔn)輸入)的每行的指定部分輸出到標(biāo)準(zhǔn)輸出。
grep用于搜索一個(gè)或多個(gè)文件中匹配指定模式的行。
tar用于歸檔文件的應(yīng)用程序。
head用于讀取文件的開頭部分(默認(rèn)是 10 行)。如果沒有指定文件,則從標(biāo)準(zhǔn)輸入讀取。
paste用于合并文件的行。
sed用于過濾和轉(zhuǎn)換文本的流編輯器。
sort用于對(duì)文本文件的行進(jìn)行排序。
split用于將文件分割成塊。
strings用于打印文件中可打印的字符串。
tac與 cat 命令的功能相反,用于倒序地顯示文件或連接文件。
tail用于顯示文件的結(jié)尾部分。
tee用于從標(biāo)準(zhǔn)輸入讀取內(nèi)容并寫入到標(biāo)準(zhǔn)輸出和文件。
tr用于轉(zhuǎn)換或刪除字符。
uniq用于報(bào)告或忽略重復(fù)的行。
wc用于打印文件中的總行數(shù)、單詞數(shù)或字節(jié)數(shù)。

接下來,我們通過幾個(gè)實(shí)例來演示一下過濾器的使用。

在管道中使用 awk 命令

關(guān)于 awk 命令的具體用法,請(qǐng)大家自行學(xué)習(xí),本節(jié)我們我們僅通過幾個(gè)簡(jiǎn)單的實(shí)例來了解一下 awk 命令在管道中的使用。

實(shí)例1

查看系統(tǒng)中的所有的賬號(hào)名稱,并按名稱的字母順序排序。

[jb51.net]$ awk -F: '{print $1}' /etc/passwd | sort
adm
apache
avahi
avahi-autoipd
bin
daemon
dbus
ftp
games
...

在上例中,使用冒號(hào):作為列分隔符,將文件 /etc/passwd 的內(nèi)容分為了多列,并打印了第一列的信息(即用戶名),然后將輸出通過管道發(fā)送到了 sort 命令。

實(shí)例2

列出當(dāng)前賬號(hào)最常使用的 10 個(gè)命令。

[jb51.net]$ history | awk '{print $2}' | sort | uniq -c | sort -rn | head
140 echo
 75 man
 71 cat
 63 su
 53 ls
 50 vi
 47 cd
 40 date
 26 let
 25 paste

在上例中,history 命令將輸出通過管道發(fā)送到 awk 命令,awk 命令默認(rèn)使用空格作為列分隔符,將 history 的輸出分為了兩列,并把第二列內(nèi)容作為輸出通過管道發(fā)送到了 sort 命令,使用 sort 命令進(jìn)行排序后,再將輸出通過管道發(fā)送到了 uniq 命令,使用 uniq 命令 統(tǒng)計(jì)了歷史命令重復(fù)出現(xiàn)的次數(shù),再用 sort 命令將 uniq 命令的輸出按照重復(fù)次數(shù)從高到低排序,最后使用 head 命令默認(rèn)列出前 10 個(gè)的信息。

實(shí)例3

顯示當(dāng)前系統(tǒng)的總內(nèi)存大小,單位為 KB。

[jb51.net]$ free | grep Mem | awk '{print $2}'
2029860

在管道中使用 cut 命令

cut 命令被用于文本處理。你可以使用這個(gè)命令來提取文件中指定列的內(nèi)容。

實(shí)例1

查看系統(tǒng)中登錄 Shell 是“/bin/bash”的用戶名和對(duì)應(yīng)的用戶主目錄的信息:

[jb51.net]$ grep "bin/bash" /etc/passwd | cut -d: -f1,6
root:/root
mozhiyan:/home/mozhiyan

如果你對(duì) Linux 系統(tǒng)有所了解,你會(huì)知道,/ctc/passwd 文件被用來存放用戶賬號(hào)的信息,此文件中的每一行會(huì)記錄一個(gè)賬號(hào)的信息,每個(gè)字段之間用冒號(hào)分隔,第一個(gè)字段即是賬號(hào)的賬戶名,而第六個(gè)字段就是賬號(hào)的主目錄的路徑。

實(shí)例2

查看當(dāng)前機(jī)器的CPU類型。

[jb51.net]$ cat /proc/cpuinfo | grep name | cut -d: -f2 | uniq
Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz

上例中,執(zhí)行命令cat /proc/cpuinfo | grep name得到的內(nèi)容如下所示:

[jb51.net]$ cat /proc/cpuinfo | grep name
model name  : Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
model name  : Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
model name  : Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
model name  : Intel(R) Core(TM) i5-2520M CPU 0 2.50GHz

然后,我們使用 cut 命令將上述輸出內(nèi)容以冒號(hào)作為分隔符,將內(nèi)容分為了兩列, 并顯示第二列的內(nèi)容,最后使用 uniq 命令去掉了重復(fù)的行。

實(shí)例3

查看當(dāng)前目錄下的子目錄數(shù)。

[jb51.net]$ ls -l | cut -c 1 | grep d | wc -l
5

上述管道命令主要做了如下操作:

  • 命令ls -l輸出的內(nèi)容中,每行的第一個(gè)字符表示文件的類型,如果第一個(gè)字符是d,就表示文件的類型是目錄。

  • 命令cut -c 1是截取每行的第一個(gè)字符。

  • 命令grep d來獲取文件類型是目錄的行。

  • 命令wc -l用來獲得 grep 命令輸出結(jié)果的行數(shù),即目錄個(gè)數(shù)。

在管道中使用grep命令

grep 命令是在管道中比較常用的一個(gè)命令。

實(shí)例1

查看系統(tǒng)日志文件中的錯(cuò)誤信息。

[jb51.net]$ grep -i "error:" /var/log/messages | less

實(shí)例2

查看系統(tǒng)中 HTTP 服務(wù)的進(jìn)程信息。

[jb51.net]$ ps auxwww | grep httpd
apache 18968 0.0 0.0 26472 10404 ?  S  Dec15  0:01 /usr/sbin/httpd
apache 18969 0.0 0.0 25528 8308 ?  S  Dec15  0:01 /usr/sbin/httpd
apache 18970 0.0 0.0 26596 10524 ?  S  Dec15  0:01 /usr/sbin/httpd

實(shí)例3

查找我們的程序列表中所有命令名中包含關(guān)鍵字 zip 的命令。

[jb51.net]$ ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
bzip2recover
gunzip
gzip

實(shí)例4
查看系統(tǒng)安裝的 kernel 版本及相關(guān)的 kernel 軟件包。

[jb51.net]$ rpm -qa | grep kernel
kernel-2.6.18-92.e15
kernel-debuginfo-2.6.18-92.e15
kernel-debuginfo-common-2.6.18-92.e15
kernel-devel-2.6.18-92.e15

實(shí)例5

查找 /etc 目錄下所有包含 IP 地址的文件。

[jb51.net]$ find /etc -type f -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} \;

在管道中使用 tar 命令

tar 命令是 Linux 系統(tǒng)中最常用的打包文件的程序。

實(shí)例1

你可以使用 tar 命令復(fù)制一個(gè)目錄的整體結(jié)構(gòu)。

[jb51.net]$ tar cf - /home/mozhiyan | ( cd /backup/; tar xf - )

實(shí)例2
跨網(wǎng)絡(luò)地復(fù)制一個(gè)目錄的整體結(jié)構(gòu)。

[jb51.net]$ tar cf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xf - )"

實(shí)例3
跨網(wǎng)絡(luò)地壓縮復(fù)制一個(gè)目錄的整體結(jié)構(gòu)。

[jb51.net]$ tar czf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xzf - )"

實(shí)例4
檢査 tar 歸檔文件的大小,單位為字節(jié)。

[jb51.net]$ cd /; tar cf - etc | wc -c
215040

實(shí)例5
檢查 tar 歸檔文件壓縮為 tar.gz 歸襠文件后所占的大小。

[jb51.net]$ tar czf - etc.tar | wc -c
58006

實(shí)例6
檢查 tar 歸檔文件壓縮為 tar.bz2 歸襠文件后所占的大小。

[jb51.net]$ tar cjf - etc.tar | wc -c
50708

在管道中使用 head 命令

有時(shí),你不需要一個(gè)命令的全部輸出,可能只需要命令的前幾行輸出。這時(shí),就可以使用 head 命令,它只打印命令的前幾行輸出。默認(rèn)的輸出行數(shù)為 10 行。

實(shí)例1

顯示 ls 命令的前 10 行輸出。

[jb51.net]$ ls /usr/bin | head
addftinfo
afmtodit
apropos
arch
ash
awk
base64
basename
bash
bashbug

實(shí)例2
顯示 ls 命令的前 5 行內(nèi)容。

[jb51.net]$ ls / | head -n 5
bin
cygdrive
Cygwin.bat
Cygwin.ico
Cygwin-Terminal.ico

在管道中使用 uniq 命令

uniq 命令用于報(bào)告或刪除重復(fù)的行。我們將使用一個(gè)測(cè)試文件進(jìn)行管道中使用 uniq 命令的實(shí)例講解,其內(nèi)容如下所示:

[jb51.net]$ cat testfile
This line occurs only once.
This line occurs twice.
This line occurs twice.
This line occurs three times.
This line occurs three times.
This line occurs three times.

實(shí)例1
去掉輸出中重復(fù)的行。

[jb51.net]$ sort testfile | uniq
This line occurs only once.
This line occurs three times.
This line occurs twice.

實(shí)例2
顯示輸出中各重復(fù)的行出現(xiàn)的次數(shù),并按次數(shù)多少倒序顯示。

[jb51.net]$ sort testfile | uniq -c | sort -nr
3 This line occurs three times.
2 This line occurs twice.
1 This line occurs only once.

在管道中使用 wc 命令

wc 命令用于統(tǒng)計(jì)包含在文本流中的字符數(shù)、單同數(shù)和行數(shù)。

實(shí)例1
統(tǒng)計(jì)當(dāng)前登錄到系統(tǒng)的用戶數(shù)。

[jb51.net]$ who | wc -l

實(shí)例2
統(tǒng)計(jì)當(dāng)前的 Linux 系統(tǒng)中的進(jìn)程數(shù)。

[jb51.net]$ ps -ef | wc -l

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI