1. 程式人生 > 其它 >Shell 管道指令pipe

Shell 管道指令pipe

目錄

管道命令pipe

1.管道命令僅處理標準輸出,對於標準錯誤輸出會省略。
2.管道命令必須能夠接受來自前一個命令的資料作為標準輸入繼續處理才行

選取命令 cut、grep

一段資料經過分析後,取出我們要的。或是經由分析關鍵詞,取出我們想要的

選取資訊通常是針對一行一行來分析的

cut 取出需要的資訊

將一行資訊當中,取出我們想要的資訊,處理資訊以行為單位

語法
用於有特定分割字元
cut -d ‘分割字元’ -f 第幾個欄位(從1開始計數)

用於排列整齊的資訊,以字元的單位取出固定字元區間
cut -c 字元區間

選項和引數
-d 後面接分隔字元,與-f一起使用
-f fields 根據-d劃分的段數,取出第幾段
-c 以字元的單位取出固定字元區間

案例

取出PATH的第三個欄位

[ranan@c105 ~]$ echo $PATH
/home/mpi/bin:/home/ranan/.local/bin:/home/ranan/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
[ranan@c105 ~]$ echo $PATH | cut -d ':' -f 3,4
/home/ranan/bin
[ranan@c105 ~]$ echo $PATH | cut -d ':' -f 3-5
/home/ranan/bin:/usr/local/bin:/usr/bin

取出每行的前5個字元

[ranan@c105 ~]$ echo $PATH | cut -c 1-5
/home

grep 取出需要行、過濾不需要的行

分析一行資訊,若當中有我們需要的資訊,就把一行拿出來
可以先grep取出一行再利用cut取出需要的資訊。

語法

grep [-A] [-B] [-acinv] [--color=auto] ‘查詢字元’ filename

選項與引數
-a 將二進位制文字以文字檔案的方式查詢資料
-c count計算找到'查詢字元'的此時
-i ignore忽略大小寫
-n 輸出行號
-v 反向輸出沒有字元的那些行
--color=auto 可以將找到的部分加上顏色顯示,centOS7之後,預設

-A 後面可以新增數字,after 除了輸出該行外,後面的n行也輸出
-B 後面可以新增數字,before 除了輸出該行外,前面的n行也輸出

[ranan@c105 ~]$ last -n 5
ranan    pts/1        192.168.10.1     Fri Dec  3 15:53   still logged in
ranan    pts/0        192.168.10.1     Fri Dec  3 10:11    gone - no logout
reboot   system boot  4.18.0-240.22.1. Fri Dec  3 10:11   still running
ranan    pts/0        192.168.10.1     Thu Dec  2 20:49 - 09:52  (13:03)
reboot   system boot  4.18.0-240.22.1. Thu Dec  2 20:49 - 09:52  (13:03)

wtmp begins Sun May 23 20:25:21 2021

[ranan@c105 ~]$ last -n 5 | grep -n -A1  '192'
1:ranan    pts/1        192.168.10.1     Fri Dec  3 15:53   still logged in
2:ranan    pts/0        192.168.10.1     Fri Dec  3 10:11    gone - no logout
3-reboot   system boot  4.18.0-240.22.1. Fri Dec  3 10:11   still running
4:ranan    pts/0        192.168.10.1     Thu Dec  2 20:49 - 09:52  (13:03)
5-reboot   system boot  4.18.0-240.22.1. Thu Dec  2 20:49 - 09:52  (13:03)

排序命令 sort、wc、uniq

使用場景: 計算一次資料裡面的相同形式的資料總數

sort 排序

sort可以根據不同的資料形式來排序,sort將檔案的每一行作為一個單位,相互比較,比較原則是從首字元向後,依次按ASCII碼值進行比較,最後將他們按升序輸出。

語法

sort [-fbMnrtuk][-o<輸出檔案>][-t<分割字元>] [+<起始欄位>-<結束欄位>] [file or stdin]

常見引數

-f 忽略大小寫
-b 忽略每行開始的空格字元
-M 以月份的名字來排序
-m 將幾個排序好的檔案進行整合
-n 使用數值的大小排序
-o<輸出檔案>將排序後的結果存入指定的檔案
-r 降序,預設升序
-c 檢查檔案是否已經按照順序排序
-u uniq,去重配合-c,嚴格校驗,不配合-c,則只輸出一次排序結果,一般用uniq代替。
-t<分隔字元> 指定排序時所用的欄位分隔字元,預設[Tab]來分隔
-k 選第幾列或第幾列的第幾個字元排序

案例

個人賬號都記錄在/etc/passwd下,將賬號進行排序

[ranan@c105 ~]$ cat /etc/passwd | sort

/etc/passwd內容以:分割,我們以第三欄

[ranan@c105 ~]$ cat /etc/passwd | sort -t ':' -k 3
# 按數字排列
[ranan@c105 ~]$ cat /etc/passwd | sort -t ':' -k 3 -n

預設是以ASCII排列

按數字排序

假設三位數,按十位數從小到大,個位數從大到小排序。

[ranan@c105 ~]$ cat number.txt
991
454
522
258
322
[ranan@c105 ~]$ sort -n -k 1.2 -k 1.3nr number.txt # 為什麼不行!錯誤寫法
322
522
454
258
991
[ranan@c105 ~]$ sort -n -k 1.2,1.2 -k 1.3nr number.txt #第一列的第2個字元,從小到大,第一列的第三個字元,從大到小 這裡r也就是-r
322
522
258
454
991

注意這裡排序的第一種寫法是錯誤的,省略了End部分,這就意味著你將對從第二個字母起到本域最後一個字元為止的字串進行排序。如果不設定End部分,那麼就認為End被設定為行尾,但是從小到大是隻需要十位,不需要個位,所以需要限定。

把排序的結果輸出到原始檔

[ranan@c105 ~]$ cat number.txt | sort -k 1.2 > number.txt
[ranan@c105 ~]$ cat number.txt #number.txt為空了,說明重定向的方法不可用
# 使用-o
[ranan@c105 ~]$ cat number.txt 
34
45
52
29
91
[ranan@c105 ~]$ cat number.txt | sort -k 1.2 -o number.txt
[ranan@c105 ~]$ cat number.txt
91
52
34
45
29

-u與-k的結合

-u只識別用-k設定的域,發現相同,就將後續相同的行都刪除。

如果有兩層排序,-u是會權衡所有-k選項,將都相同的才會刪除,只要其中有一級不同都不會輕易刪除的。

注意:如果遇見跨域,跨域的設定是個假象,不會跨域比較

[ranan@c105 ~]$ cat facebook.txt 
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500
[ranan@c105 ~]$ sort -n -k 2 facebook.txt 
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000
[ranan@c105 ~]$ sort -n -k 2 -u facebook.txt 
guge 50 3000
baidu 100 5000
google 110 5000

uniq 去重

如果排序完成了,將重複的資料僅列出一個顯示可以使用uniq

語法
uniq [-ic]

-i 忽略大小寫
-c 進行重複出現的計數
-u 只顯示不重複的行
-d 只顯示重複的行

uniq最好結合排序使用,因為unqi只會將挨著的重複行刪除

[ranan@c105 ~]$ last | cut -d ' ' -f 1
ranan
reboot
ranan
ranan
[ranan@c105 ~]$ last | cut -d ' ' -f 1 | uniq
ranan
reboot
ranan
[ranan@c105 ~]$ last | cut -d ' ' -f 1 | sort |uniq

ranan
reboot

wc 統計

wc可以統計一個檔案裡面有多少字,多少行,多少字元,可以幫我們計算輸出資訊的整體資料

語法
wc [-lwm]

-l 列出行
-w 列出多少字(英文字母)
-m 多少字元

如果只使用wc 預設是按lwm的順序輸出