溫馨提示×

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

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

Linux管道命令怎么使用

發(fā)布時(shí)間:2022-02-11 09:29:46 來源:億速云 閱讀:159 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Linux管道命令怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Linux管道命令怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

管道是一種最基本的IPC機(jī)制,作用于有血緣關(guān)系的進(jìn)程之間,完成數(shù)據(jù)傳遞。調(diào)用pipe系統(tǒng)函數(shù)即可創(chuàng)建一個(gè)管道。

Linux管道命令怎么使用

管道命令

管道命令使用|作為界定符號(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的輸入,方便瀏覽。

Linux管道命令怎么使用
img

管道命令的處理圖

選取命令: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,6root:/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-10root: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
...
Linux管道命令怎么使用
img

加上–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 | sortadm: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 3root: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 -nroot: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 -l23
計(jì)算最近登錄系統(tǒng)的人次
[root@izuf6i29flb2df231kt91hz /]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l2
查看某個(gè)文件的行數(shù) 字?jǐn)?shù) 字符數(shù)
[root@izuf6i29flb2df231kt91hz /]# cat etc/passwd | wc    23      32     997
雙向重定向命令:tee
  • tee:

    在數(shù)據(jù)流的處理過程中將某段信息保存下來,使其既能輸出到屏幕又能保存到某一個(gè)文件中。

    Linux管道命令怎么使用
    img

    tee的工作流程.png

?

tee [-a] file`
`[參數(shù)]`
`-a : 以累加的方式,將數(shù)據(jù)加入file中
栗子7
查詢最近用戶登錄情況,并將其保存到文件中
[root@izuf6i29flb2df231kt91hz /]# last | tee info | cut -d ' ' -f 1root
...
[root@izuf6i29flb2df231kt91hz /]# less inforoot     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 inforoot     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è)字符
Linux管道命令怎么使用
img
栗子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  /etc/shadow $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/shadowroot: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/group0: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 /]# lsb    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 /]# lsb    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

讀到這里,這篇“Linux管道命令怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向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