3.2 管道命令符

2021-05-18 17:28 更新

細心的讀者肯定還記得在2.6節(jié)學習tr命令時曾經(jīng)見到過一個名為管道符的東西。同時按下鍵盤上的Shift+\鍵即可輸入管道符,其執(zhí)行格式為“命令A | 命令B”。管道命令符的作用也可以用一句話來概括“把前一個命令原本要輸出到屏幕的標準正常數(shù)據(jù)當作是后一個命令的標準輸入”。在2.8節(jié)講解grep文本搜索命令時,我們通過匹配關(guān)鍵詞/sbin/nologin找出了所有被限制登錄系統(tǒng)的用戶。在學完本節(jié)內(nèi)容后,完全可以把下面這兩條命令合并為一條:

找出被限制登錄用戶的命令是grep "/sbin/nologin" /etc/passwd;

統(tǒng)計文本行數(shù)的命令則是wc -l。

現(xiàn)在要做的就是把搜索命令的輸出值傳遞給統(tǒng)計命令,即把原本要輸出到屏幕的用戶信息列表再交給wc命令作進一步的加工,因此只需要把管道符放到兩條命令之間即可,具體如下。這簡直是太方便了!

    [root@linuxprobe ~]# grep "/sbin/nologin" /etc/passwd | wc -l
    33

這個管道符就像一個法寶,我們可以將它套用到其他不同的命令上,比如用翻頁的形式查看/etc目錄中的文件列表及屬性信息(這些內(nèi)容默認會一股腦兒地顯示到屏幕上,根本看不清楚):

    [root@linuxprobe ~]# ls -l /etc/ | more
    total 1400
    drwxr-xr-x. 3 root root 97 Jul 10 17:26 abrt
    -rw-r--r--. 1 root root 16 Jul 10 17:36 adjtime
    -rw-r--r--. 1 root root 1518 Jun 7 2013 aliases
    -rw-r--r--. 1 root root 12288 Jul 10 09:38 aliases.db
    drwxr-xr-x. 2 root root 49 Jul 10 17:26 alsa
    drwxr-xr-x. 2 root root 4096 Jul 10 17:31 alternatives
    -rw-------. 1 root root 541 Jan 28 2017 anacrontab
    -rw-r--r--. 1 root root 55 Jan 29 2017 asound.conf
    -rw-r--r--. 1 root root 1 Jan 29 2017 at.deny
    drwxr-xr-x. 2 root root 31 Jul 10 17:27 at-spi2
    drwxr-x---. 3 root root 41 Jul 10 17:26 audisp
    drwxr-x---. 3 root root 79 Jul 10 17:37 audit
    drwxr-xr-x. 4 root root 94 Jul 10 17:26 avahi
    --More--

在修改用戶密碼時,通常都需要輸入兩次密碼以進行確認,這在編寫自動化腳本時將成為一個非常致命的缺陷。通過把管道符和passwd命令的--stdin參數(shù)相結(jié)合,我們可以用一條命令來完成密碼重置操作:

    [root@linuxprobe ~]# echo "linuxprobe" | passwd --stdin root
    Changing password for user root.
    passwd: all authentication tokens updated successfully.

大家是不是覺得管道符命令有些相見恨晚?管道符的玩法還有很多,比如,在發(fā)送電子郵件時,默認采用交互式的方式來進行,我們完全可以利用一條結(jié)合了管道符的命令語句,把編輯好的內(nèi)容與標題一起“打包”,最終用這一條命令實現(xiàn)郵件的發(fā)送。

    [root@linuxprobe ~]# echo "Content" | mail -s "Subject" linuxprobe
    [root@linuxprobe ~]# su - linuxprobe
    Last login: Fri Jul 10 09:44:07 CST 2017 on :0
    [linuxprobe@linuxprobe ~]$ mail
    Heirloom Mail version 12.5 7/5/10. Type ? for help.
    "/var/spool/mail/linuxprobe": 1 message 1 new
    >N 1 root Sun Aug 30 17:33 18/578 "Subject"

如果讀者是一名Linux新手,可能會覺得上面的命令組合已經(jīng)十分復雜了,但是有過運維經(jīng)驗的讀者又會感覺如隔靴撓癢般不過癮,他們希望能將這樣方便的命令寫得更高級一些,功能更強大一些。比如通過重定向技術(shù)能夠一次性地把多行信息打包輸入或輸出,讓日常工作更有效率。為了大家對我們這本書的捧場,劉遄老師當然要義不容辭地把技術(shù)拱手奉上。

下面這條自造的命令就結(jié)合使用了mail郵件命令與輸入重定向的分界符,其目的是讓用戶一直輸入內(nèi)容,直到用戶輸入了其自定義的分界符時,才結(jié)束輸入。

[root@linuxprobe ~]# mail -s "Readme" root@linuxprobe.com << over
> I think linux is very practical
> I hope to learn more
> can you teach me ?
> over
[root@linuxprobe ~]#

當然,大家千萬不要誤以為管道命令符只能在一個命令組合中使用一次,我們完全可以這樣使用:“命令A | 命令B | 命令C”。為了幫助讀者進一步理解管道符的作用,劉遄老師在講課時經(jīng)常會把管道符描述成“任意門”。想必大家小時候都看過“哆啦A夢”動畫片吧。哆啦A夢(也就是我們常稱的機器貓)經(jīng)常為了取悅大雄而從口袋中掏出一件件寶貝,其中好多次就用到了任意門這個道具。其實,管道符就好像是用于實現(xiàn)數(shù)據(jù)穿越的任意門,可以幫我們提高工作效率,完成之前不敢想象的復雜工作。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號