Linux管道命令(pipe)

學(xué)習(xí)管道之前我們先了解一下linux的命令執(zhí)行順序

命令執(zhí)行順序控制

通常情況下,我們?cè)诮K端只能執(zhí)行一條命令,然后按下回車執(zhí)行,那么如何執(zhí)行多條命令呢贤惯?

  • 順序執(zhí)行多條命令:command1;command2;command3;
    簡(jiǎn)單的順序指令可以通過 ;來實(shí)現(xiàn)
  • 有條件的執(zhí)行多條命令:which command1 && command2 || command3
    && : 如果前一條命令執(zhí)行成功則執(zhí)行下一條命令,如果command1執(zhí)行成功(返回0),則執(zhí)行command2
    || :與&&命令相反棒掠,執(zhí)行不成功時(shí)執(zhí)行這個(gè)命令
  • $?: 存儲(chǔ)上一次命令的返回結(jié)果
栗子:
$ which git>/dev/null && git --help  // 如果存在git命令孵构,執(zhí)行g(shù)it --help命令
$ echo $? 

管道命令

管道是一種通信機(jī)制,通常用于進(jìn)程間的通信(也可通過socket進(jìn)行網(wǎng)絡(luò)通信)烟很,它表現(xiàn)出來的形式將前面每一個(gè)進(jìn)程的輸出(stdout)直接作為下一個(gè)進(jìn)程的輸入(stdin)颈墅。

管道命令使用|作為界定符號(hào)蜡镶,管道命令與上面說的連續(xù)執(zhí)行命令不一樣。

  • 管道命令僅能處理standard output,對(duì)于standard error output會(huì)予以忽略恤筛。
    less,more,head,tail...都是可以接受standard input的命令官还,所以他們是管道命令
    ls,cp,mv并不會(huì)接受standard input的命令,所以他們就不是管道命令了毒坛。

  • 管道命令必須要能夠接受來自前一個(gè)命令的數(shù)據(jù)成為standard input繼續(xù)處理才行望伦。

第一個(gè)管道命令

$ ls -al /etc | less

通過管道將ls -al的輸出作為 下一個(gè)命令less的輸入,方便瀏覽煎殷。

管道命令的處理圖

選取命令:cut.grep

  • cut:從某一行信息中取出某部分我們想要的信息屯伞。

cut -d '分隔字符' -f field // 用于分隔字符
cut -c 字符范圍
[參數(shù)說明]
-d : 后面接分隔字符,通常與 -f 一起使用
-f : 根據(jù)-d 將信息分隔成數(shù)段,-f 后接數(shù)字 表示取出第幾段
-c : 以字符為單位取出固定字符區(qū)間的信息

栗子1:
打印/etc/passwd文件中以:為分隔符的第1個(gè)字段和第6個(gè)字段分別表示用戶名和家目錄
[root@izuf6i29flb2df231kt91hz /]# cat etc/passwd | cut -d ':' -f 1,6
root:/root
bin:/bin
daemon:/sbin
adm:/var/adm
lp:/var/spool/lpd
...
栗子2:
打印/etc/passwd文件中每一行的前10個(gè)字符:
[root@izuf6i29flb2df231kt91hz /]# cat /etc/passwd | cut -c 1-10
root:x:0:0
bin:x:1:1:
daemon:x:2
adm:x:3:4:
lp:x:4:7:l
...

ps:cut在處理多空格相連的數(shù)據(jù)時(shí)豪直,比較吃力劣摇。

  • grep:分析一行信息,如果其中有我們需要的信息弓乙,就將該行拿出來

grep [-acinv] [--color=auto] '查找字符串' filename
[參數(shù)]
-a : 將binary文件以text文件的方式查找數(shù)據(jù)
-c : 計(jì)算找到 '查找字符串'的次數(shù)
-i : 忽略大小寫的不同
-n : 輸出行號(hào)
-v : 反向選擇末融,顯示沒有查找內(nèi)容的行
--color=auto : 將找到的關(guān)鍵字部分加上顏色顯示

栗子3:
取出含有 fanco 的/etc/passwd文件的行
[root@izuf6i29flb2df231kt91hz /]# cat etc/passwd | grep -n -c 'fanco'
1
[root@izuf6i29flb2df231kt91hz /]# cat etc/passwd | grep -n 'fanco'
23:fanco:x:1001:1001::/home/fanco:/bin/bash
[root@izuf6i29flb2df231kt91hz /]# cat etc/passwd | grep -n -v 'fanco'
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
...
加上--color參數(shù),好像不加默認(rèn)也有顏色

排序命令:sort,wc,uniq

sort

sort [-fbMnrtuk] [file or stdin]
[參數(shù)]
-f :忽略大小寫的差異暇韧,例如A 與a 視為編碼相同
-b :忽略最前面的空格部分
-M :以月份的名字來排序勾习,例如JAN, DEC 等等的排序方法
-n :使用『純數(shù)字』進(jìn)行排序默認(rèn)是以文字型態(tài)來排序的)
-r :反向排序
-u :就是uniq ,相同的資料中锨咙,僅出現(xiàn)一行代表
-t :分隔符號(hào)语卤,預(yù)設(shè)是用[tab] 鍵來分隔
-k :以那個(gè)區(qū)間(field) 來進(jìn)行排序的意思

栗子4:
對(duì)/etc/passwd的賬號(hào)進(jìn)行排序
[root@izuf6i29flb2df231kt91hz /]# cat /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
...
通過/etc/passwd 第5列來進(jìn)行排序
[root@izuf6i29flb2df231kt91hz /]# cat etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
fanco:x:1001:1001::/home/fanco:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
這里排序還是按照文字進(jìn)行排序的追逮,切換成數(shù)字排序
[root@izuf6i29flb2df231kt91hz /]# cat etc/passwd | sort -t ':' -k 3 -n
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • uniq

uniq [-ic]
[參數(shù)]
-i :忽略大小寫的不同
-c :進(jìn)行計(jì)數(shù)

栗子5
使用 last 取出歷史登錄信息的賬號(hào)酪刀,排序,去重
[root@izuf6i29flb2df231kt91hz /]# last | cut -d ' ' -f 1 | sort | uniq -c
      1 
      7 reboot
     19 root
      1 wtmp
  • wc

wc [-lwm]
[參數(shù)]
-l :僅列出行
-w :僅列出多少字(英文單字)
-m :多少字符

栗子6
查看etc/passwd中有多少賬號(hào)
[root@izuf6i29flb2df231kt91hz /]# cat /etc/passwd | wc -l
23
計(jì)算最近登錄系統(tǒng)的人次
[root@izuf6i29flb2df231kt91hz /]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
2
查看某個(gè)文件的行數(shù) 字?jǐn)?shù) 字符數(shù)
[root@izuf6i29flb2df231kt91hz /]# cat etc/passwd | wc
     23      32     997

雙向重定向命令:tee

  • tee:在數(shù)據(jù)流的處理過程中將某段信息保存下來钮孵,使其既能輸出到屏幕又能保存到某一個(gè)文件中骂倘。
    tee的工作流程.png

tee [-a] file
[參數(shù)]
-a : 以累加的方式,將數(shù)據(jù)加入file中

栗子7
查詢最近用戶登錄情況巴席,并將其保存到文件中
[root@izuf6i29flb2df231kt91hz /]# last | tee info | cut -d ' ' -f 1
root
...
[root@izuf6i29flb2df231kt91hz /]# less info
root     pts/0        112.28.181.159   Sun Jul  1 14:28   still logged in   
root     pts/0        112.28.181.159   Sun Jul  1 14:24 - 14:27  (00:03)    
root     pts/0        112.28.181.159   Sun Jul  1 13:19 - 14:24  (01:04)    
root     tty1                          Sun Jul  1 12:46   still logged in   

如果tee后接的文件已存在历涝,內(nèi)容會(huì)被覆蓋掉,加上 -a參數(shù)則會(huì)累加

字符轉(zhuǎn)換命令:tr,col,join,paste,expand

  • tr:用來刪除一段信息當(dāng)中的文字漾唉,或者進(jìn)行文字信息得替換

tr [-ds] set
[參數(shù)]
-d : 刪除信息當(dāng)中的set1這個(gè)字符串
-s : 替換掉重復(fù)的字符

栗子8
將上一步生成的info 文件刪除掉所有的 root
刪除前
[root@izuf6i29flb2df231kt91hz /]# cat info
root     pts/0        112.28.180.86    Thu May 10 18:01 - 18:12  (00:11)    
reboot   system boot  3.10.0-693.2.2.e Fri May 11 02:00 - 16:31 (51+14:30)  
 刪除后
[root@izuf6i29flb2df231kt91hz /]# cat info | tr -d 'root'  
     ps/0        112.28.180.86    Thu May 10 18:01 - 18:12  (00:11)    
eb   sysem b  3.10.0-693.2.2.e Fi May 11 02:00 - 16:31 (51+14:30)  

刪除時(shí)并不是只刪除連續(xù)的字符荧库,reboot也被刪除掉了root部分
除去dos文件留下來的^M符號(hào)
$ cat /root/passwd | tr -d '\r' > /root/passwd.linux
^M可以用\r替代
  • col

col [-xb]
[參數(shù)]
-x : 將tab鍵換成對(duì)等的空格鍵
-b : 在文字內(nèi)有反斜杠(/)時(shí),僅保留反斜杠最后接的那個(gè)字符

栗子9
將上圖中的^I換成空格鍵
[root@izuf6i29flb2df231kt91hz /]# cat info | col -x | cat -A | more
        root     pts/0        112.28.181.159   Sun Jul  1 14:28   still logged in$

col經(jīng)常被用于將man page轉(zhuǎn)存為純文本文件

  • join:主要講兩個(gè)文件有相同數(shù)據(jù)的一行,相同字段放在前面

join [-ti12] file1 file2
[參數(shù)]
-t : join 默認(rèn)以空格符分隔數(shù)據(jù)赵刑,并且對(duì)比第一個(gè)字段的數(shù)據(jù) ,如果兩個(gè)文件相同分衫,則將兩條數(shù)據(jù)連成一行
-i : 忽略大小寫的差異
-1 : 說明第一個(gè)文件通過那個(gè)字段來進(jìn)行分析
-2 : 說明第二個(gè)文件通過那個(gè)字段來分析

栗子10
將/etc/passwd 與  /etc/shadow 相關(guān)數(shù)據(jù)整合成一列
[root@izuf6i29flb2df231kt91hz /]# head -3 /etc/passwd /etc/shadow
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

==> /etc/shadow <==
root:$6$RNGEziM7$2e/EJd3hThS8TMqHSgDIfeDf7dJUG1dbJ0ik1goybGYmLGZL.sHNv1Ltb4.1HUksxTI0Cs3PJw5g/YirSImKg1:17643:0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
[root@izuf6i29flb2df231kt91hz /]# join -t ':' /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash:$6$RNGEziM7$2e/EJd3hThS8TMqHSgDIfeDf7dJUG1dbJ0ik1goybGYmLGZL.sHNv1Ltb4.1HUksxTI0Cs3PJw5g/YirSImKg1:17643:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:17110:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:17110:0:99999:7:::

將etc/passwd 按:分隔的第4個(gè)字段 與 etc/group的第3個(gè)字段 比較,如果相同般此,則將他兩同行數(shù)據(jù)放在一起
[root@izuf6i29flb2df231kt91hz /]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group
0:root:x:0:root:/root:/bin/bash:root:x:
1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:
2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:
4:adm:x:3:adm:/var/adm:/sbin/nologin:adm:x:
join: /etc/passwd:6: is not sorted: sync:x:5:0:sync:/sbin:/bin/sync
7:lp:x:4:lp:/var/spool/lpd:/sbin/nologin:lp:x:
  • paste:直接將兩個(gè)文件兩行貼在一起蚪战,中間以[tab]鍵隔開

paste [-d] file1 file2
[ 參數(shù)]
-d : 后面可以接分隔字符牵现,默認(rèn)以[tab]來分隔的
- : 如果file部分寫成-,表示接受standard input數(shù)據(jù)的意思

栗子11
[root@izuf6i29flb2df231kt91hz /]# paste info info2
    root     pts/0        112.28.181.159   Sun Jul  1 14:28   still logged in       root     pts/0        112.28.181.159   Sun Jul  1 14:28   still logged in   
root     pts/0        112.28.181.159   Sun Jul  1 14:24 - 14:27  (00:03)        root     pts/0        112.28.181.159   Sun Jul  1 14:24 - 14:27  (00:03)    
root     pts/0        112.28.181.159   Sun Jul  1 13:19 - 14:24  (01:04)        root     pts/0        112.28.181.159   Sun Jul  1 13:19 - 14:24  (01:04) 
  • *expand:把tab鍵轉(zhuǎn)為空格鍵

expand [-t] file
[參數(shù)]
`` -t : 后面接數(shù)字邀桑,一般瞎疼,一個(gè)tab可以用8個(gè)空格代替,可以自行定義代表幾個(gè)空格

栗子12
[root@izuf6i29flb2df231kt91hz /]# cat info | expand -3 info
   root     pts/0        112.28.181.159   Sun Jul  1 14:28   still logged in   
root     pts/0        112.28.181.159   Sun Jul  1 14:24 - 14:27  (00:03)    
root     pts/0        112.28.181.159   Sun Jul  1 13:19 - 14:24  (01:04)    
root     tty1                          Sun Jul  1 12:46   still logged in

切割命令:split

split:顧名思義壁畸,講一個(gè)大文件依據(jù)文件大小或行數(shù)切割成為小文件

split [-bl] file prefix
[參數(shù)]
-b : 后面可接欲切割文件的大小贼急,可加單位,例如b,k,m等
-l : 以行數(shù)來進(jìn)行切割
PREFIX : 代表前導(dǎo)符捏萍,可作為切割文件的前導(dǎo)文字

栗子
$ split -b 300K /etc/passwd
將ls -al輸出文件  按10行分成一個(gè)新的文件
[root@izuf6i29flb2df231kt91hz /]# ls -al / | split -l 10 - lsrrot
[root@izuf6i29flb2df231kt91hz /]# ls 
b    boot  dev  home  info2  lib64       lsrrotaa  lsrrotac  mnt  opt   root  sbin  sys  usr
bin  c     etc  info  lib    lost+found  lsrrotab  media     n    proc  run   srv   tmp  var
[root@izuf6i29flb2df231kt91hz /]# cd /
[root@izuf6i29flb2df231kt91hz /]# ls
b    boot  dev  home  info2  lib64       lsrrotaa  lsrrotac  mnt  opt   root  sbin  sys  usr
bin  c     etc  info  lib    lost+found  lsrrotab  media     n    proc  run   srv   tmp  var
[root@izuf6i29flb2df231kt91hz /]# wc -l lsrrot*
  10 lsrrotaa
  10 lsrrotab
   9 lsrrotac
  29 total
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末竿裂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子照弥,更是在濱河造成了極大的恐慌腻异,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件这揣,死亡現(xiàn)場(chǎng)離奇詭異悔常,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)给赞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門机打,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人片迅,你說我怎么就攤上這事残邀。” “怎么了柑蛇?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵芥挣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我耻台,道長(zhǎng)空免,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任盆耽,我火速辦了婚禮蹋砚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摄杂。我一直安慰自己坝咐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布析恢。 她就那樣靜靜地躺著墨坚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氮昧。 梳的紋絲不亂的頭發(fā)上框杜,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天浦楣,我揣著相機(jī)與錄音,去河邊找鬼咪辱。 笑死振劳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的油狂。 我是一名探鬼主播历恐,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼专筷!你這毒婦竟也來了弱贼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤磷蛹,失蹤者是張志新(化名)和其女友劉穎吮旅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體味咳,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庇勃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了槽驶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片责嚷。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖掂铐,靈堂內(nèi)的尸體忽然破棺而出罕拂,到底是詐尸還是另有隱情,我是刑警寧澤全陨,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布爆班,位于F島的核電站,受9級(jí)特大地震影響烤镐,放射性物質(zhì)發(fā)生泄漏蛋济。R本人自食惡果不足惜棍鳖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一炮叶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渡处,春花似錦镜悉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至醇份,卻和暖如春稼锅,著一層夾襖步出監(jiān)牢的瞬間吼具,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工矩距, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拗盒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓锥债,卻偏偏與公主長(zhǎng)得像陡蝇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哮肚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容