聲明: 我覺得今天的這篇文章就像一篇“工具”文而且很雞肋:歸納一些常用的管線命令和應用參數(shù)牵啦。適合有操作需求時编整,來查找能夠幫忙解決問題的指令和參數(shù)~
學習管線命令之前要先了解管道符|
误辑,因為管線命令使用的是|
這個界定符號旋炒,它和使用;
的連續(xù)下達命令“很像”(關于連續(xù)命令符號“;”,Linux 之 Bash -- 數(shù)據(jù)流重導向里面剛學過脆淹,這里不再提啦~)常空。為了理解“|”,我們來舉個例子:
我想看一下 /etc
這個目錄下的文件列表盖溺,但是這個目錄里的東西實在太多了漓糙,直接 ls -l /etc
打印到屏幕上滿屏都是,往回翻操作記錄都麻煩烘嘱,所以可以使用ls -l /etc | less
昆禽,這樣ls指令輸出后的內容就能夠被less讀取蝗蛙,并且利用less的功能,我們就能夠前后翻動相關的信息了为狸。這是ls -l /etc ; less
達不到的效果歼郭,因為;
只起到下達命令的作用,而|
卻起到傳遞標準輸出STDOUT的作用辐棒,這是本質的區(qū)別。整體的管線命令可以用這個圖表表示:
使用時有兩個注意點:
- 管線命令僅會處理 standard output牍蜂,對于 standard error output 會予以忽略
- 管線命令必須要能夠接受來自前一個指令的數(shù)據(jù)成為 standard input 繼續(xù)處理才行
例如 ls,cp,mv這些不會接受stdin的命令漾根,是不適合放在管道符|
后面的
1.擷(xie)取命令: cut,grep
用過cut的伙伴都知道,cut可以提取列鲫竞,可是實際上辐怕,它和grep一樣都是針對文本“一行一行”來分析的,以cut -f 3 filename
為例:cut文本第一行的第3段數(shù)據(jù)从绘;cut文本第二行的第3段數(shù)據(jù)....直到文本的最后一行寄疏。最終,組成一列數(shù)據(jù)輸出出來僵井。
1.1 cut
詳細聊聊cut
的應用
-
-d
后面接分隔字符陕截,與-f
一起使用
eg:cut -d ':' -f 3,5 linux.txt
翻譯成人話就是 linux.txt以“:”為分隔字符,幫我把第3段和第5段切出來 -
-f
后面接數(shù)字批什,取出第幾段的意思 -
-c
后面接數(shù)字
以字符(characters)的單位取出固定字符區(qū)間
eg:cut -c 1-8 linux.txt
翻譯成人話 幫我把linux.txt中的农曲,每一行的,第1-8個字符切出來(如果是8-
姨谷,意即把第8個之后的字符都切出來)
1.2 grep
grep同樣是一行一行得分析捂蕴,它的做事風格很豪爽:如果當中有我想要的信息集漾,就把這一整行都拽出來
grep支持的語法很多,還支持 正規(guī)表示法 暮的,可惜panda還沒把正規(guī)表示法學通,在這里就只簡單介紹幾個參數(shù)淌实,等到后面再及時更新
-
-c
計算“搜尋字符串”的次數(shù)
eg:grep -c time linux.txt
翻譯成人話 計算time在linux.txt中出現(xiàn)的次數(shù) -
-i
忽略大小寫來擷取文本行
eg:grep -i AB linux.txt
翻譯成人話 把linux.txt文本中含有"ab or AB or Ab or aB"的文本行拽出來 -
-n
順便輸出行號 -
-v
反向選擇冻辩,顯示沒有“搜索字符串”內容的那一行
2.排序命令 sort,wc,uniq
2.1 sort
sort的大特點:可以依據(jù)不同的數(shù)據(jù)型態(tài)來排序
-
-f
忽略大小寫的差異 -
-b
忽略最前面的空格符部分 -
-M
以月份的名字來排序 -
-n
使用純數(shù)字進行排序(默認是以文字型態(tài)來排序的) -
-r
反向排序 -
-u
相同的數(shù)據(jù)中,僅出現(xiàn)一行代表(uniq) -
-t
指定分隔符(預設是用tab鍵) 和 cut 中的-d
參數(shù)作用類似 -
-k
以哪個區(qū)間排序
eg:sort -k 3 linux.txt
以linux.txt中的第3列進行排序
2.2 uniq
用于排序完成后翩伪,將重復的資料僅列出一個顯示微猖,它的一些參數(shù):
-
-i
忽略大小寫字符的不同 -
-c
進行計數(shù)
2.3 wc 統(tǒng)計行數(shù)、字數(shù)缘屹、字符數(shù)
-
-l
僅列出行 -
-w
僅列出多少字(英文單字) -
-m
多少字符
3.雙向重導向 tee
tee的功能其實很簡單凛剥,可以讓standard output轉存一份到文件內并將同樣的數(shù)據(jù)繼續(xù)送到屏幕去處理
舉個例子來認識它:
ls -l | tee list.txt | less
翻譯成人話:查看當前目錄并且將目錄內容保存到 list.txt中看到了吧,這里tee把standard ourtput做了雙向輸出:一個走向
list.txt
;一個走向 屏幕轻姿,不過我這里用less
來查看信息除此之外犁珠,記憶一個tee的參數(shù):
-
-a
以累加的方式逻炊,將數(shù)據(jù)加入file當中(類似>>
)
4.字符轉換命令:tr,col,join,paste,expand
4.1 tr(刪除或替換文字訊息)
刪除一段訊息中的文字;或者進行文字訊息的替換
注意:tr只能從標準輸入中讀取數(shù)據(jù)犁享,因此使用tr時,
1.要么通過<
將輸入文件重定向到標準輸入余素;
2.要么通過管道符|
讀入數(shù)據(jù)
-
tr '[a-z]' '[A-Z]'
將所有的小寫變成大寫
eg:tr '[a-z]' '[A-Z]' < list.txt
將list.txt 中的所有小寫字母轉換成大寫輸出到屏幕 -
-d
刪除訊息當中的字符串
eg:cat /etc/passwd | tr -d ':'
/etc/passwd 輸出的訊息中,將“:”刪除 -
-s
取代掉重復的字符
4.2 col(用對等的空格鍵取代tab鍵)
最常用的操作:通過使用參數(shù)-x
炊昆,將[tab]按鍵取代成為對應的 相同長度的 空格鍵
eg:cat -A list.txt
(如果list.txt 中有tab鍵,就會看到很多^I的符號;cat -A
可以顯示出所有的特殊按鍵)
再試試cat list.txt | col -x | cat -A
這樣打印到屏幕的輸出就美觀多了
不要光說不做哦~just do it ~
4.3 join(根據(jù)相關性合并文件)
join這個小命令只能處理2個文件之間的數(shù)據(jù):兩個文件當中桨吊,有“相同數(shù)據(jù)”的那一行,才將他們加在一起
例如 /etc/passwd 和 /etc/shadow這兩個文件(先看他們的文本特點):
可以看到凤巨,這兩個文本的分隔符都是
:
视乐,同時第一個字段的內容都相同(都是 root,bin,daemon),如果我們想要把兩個文本中不同的數(shù)據(jù)合在一起敢茁,就可以使用join將他們變成這個樣子:join -t ':' /etc/passwd /etc/shadow | head -n 3
認識join的一些參數(shù):join [-ti12] file1 file2
-
-t
: 用來指定分隔符
??join -t ':' /etc/passwd /etc/shadow | head -n 3
中就是讓兩個文件合并后以':'分隔佑淀。如果不設置的話,默認以空格分隔數(shù)據(jù) -
-i
: 忽略大小寫的差異 -
-1
代表第一個文件-2
代表第二個文件
這兩個數(shù)字分別指代對應文件要用哪個字段來分析進行整合
eg:join -1 2 a.txt -2 3 b.txt
翻譯成人話 將a.txt的第2個字段和b.txt的第3個字段整合在一起
注意:插播一下使用join時的注意點
1.需要處理的文件以防順序錯亂彰檬,最好排序并去重后再join伸刃;
2.指定要整合的字段要相同啊逢倍!
而剛開始了解join時捧颅,沒有數(shù)字參數(shù)的這個指令是怎么執(zhí)行的?join -t ':' /etc/passwd /etc/shadow | head -n 3
實際上瓶堕,??它只是進行了參數(shù)的省略而已隘道,linux默認以兩個文件的第1個字段進行分析和整合,完整的它應該是這個樣子join -t ':' -1 1 /etc/passwd -2 1 /etc/shadow | head -n 3
怎么樣郎笆?是不是有點頭暈谭梗?哈哈,記住就好啦~
總之宛蚓,join在處理兩個相關的數(shù)據(jù)文件時是非常有幫助的激捏,例如/etc/passwd和/etc/shadow以賬號為相關性,而/etc/passwd和/ec/group以所謂的GID(賬號的數(shù)字定義)為相關性凄吏,通過join可以把這些有用的數(shù)據(jù)放在一起远舅。
4.4 paste(簡單粗暴得合并文件)
和join作用類似,也是將兩個文件的數(shù)據(jù)貼在一起痕钢,但是它的方式簡單粗暴图柏,不會去比較內容是否相關,而是直接將行號相同的字段拼在一起任连,默認以tab鍵分隔蚤吹。
工作模式 paste [-d] file1 file2
-
-d
后面可以接分隔字符,預設是tab鍵
eg:paste /etc/passwd /etc/shadow
-
-
如果file部分寫成-
,表示來自standard input的資料的意思(以后用到再詳細解釋)
4.5 expand(用空格取代tab鍵)
還記得上面提到的col -x
嗎裁着,它可以將tab鍵取代為相同長度的空格鍵繁涂。expand和它作用類似,不過expand可以自由設定tab鍵取代成空格鍵的個數(shù)二驰,所以功能是比col -x
更強大的扔罪。
常見的工作模式 expand [-t] file
-
-t
后面可以接數(shù)字
eg:expand -t 6 a.txt | cat -A
將a.txt中的tab鍵以1:6的個數(shù)比例轉換成空格鍵,并且打印到屏幕(cat -A看一下文件內的所有特殊符號)
小插曲:** 如果我想讓空格鍵轉成tab鍵怎么辦桶雀? **
答案:使用unexpand
-
-a
除了單詞前作為單詞分隔的空格外矿酵,所有空格都會被轉換 -
--first-only
僅轉換每行開頭的空格 -
-t
指定一個tab鍵占幾個字符位(默認8)
通過expand獲得的 轉換過空格的 b.txt
通過unexpand 恢復tab建
5. 分區(qū)命令:split
split可以根據(jù)文件大小或行數(shù)來分區(qū),從而將大文件分成小文件矗积。
(在我們常用的windows里面可是個大問題啊坏瘩,而進入linux,我們可以很方便得使用split啦~)
常用工作模式: split [-bl] file PREFIX
常用選項和參數(shù)
-
-b
后面可接欲分區(qū)成的文件大心骸(可加單位,eg: b,k,m等) -
-l
以行數(shù)來進行分區(qū)
PREFIX
代表前導符的意思,可作為分區(qū)文件的前導文字
eg: - 按文件大小split
如果 a.txt 是一個800+kb的大文件妄均,可以通過split分成3個最大為300kb 的文件柱锹。 指令:split -b 300k a.txt
- 按文件行數(shù)split
如果 a.txt 是一個100+ 行的大文件,可以通過split分成6個最大為20行的文件丰包。 指令 :split -l 20 a.txt
6.參數(shù)代換:xargs
xargs 可以用來產(chǎn)生某個指令的參數(shù)禁熏,可讀入stdin的數(shù)據(jù),并且以空格符或斷行字符作為分辨邑彪,將stdin的資料分隔成arguments(參數(shù))瞧毙。
xargs聽起來很嚇人,難理解也是因為實踐與想象有差距寄症。如果學著應用它宙彪,就會發(fā)現(xiàn),它其實也是很簡單的一個命令有巧,don't panic~
常見工作模式:xargs [-0epn] command
選項與參數(shù):
-
-0
(數(shù)字0不是字母O啊~)
如果輸入的stdin含有特殊字符释漆,例如. \ \.
空格鍵等字符時,這個-0參數(shù)可以將他還原成一般字符篮迎。這個參數(shù)可以用于特殊狀態(tài)男图。 -
-e
這個是EOF (end of file) 的意思,后面可以接一個字符串甜橱,當xargs分析到這個字符串時逊笆,就會停止繼續(xù)工作。 -
-p
在執(zhí)行每個指令的argument時岂傲,都會詢問使用者的意思 -
-n
后面接次數(shù)难裆,每次command指令執(zhí)行時,要使用幾個參數(shù)的意思
實踐前熱身(可以試著在自己的集群上操作)
下面分幾步介紹
id
,同時襯托一下xargs
存在的“魅力”譬胎!
id
指令可以查詢用戶的UID/GID等信息 eg:id root
- step 1 認識
id
只接受一個參數(shù)的局限性
id $(cut -d ':' -f 1 /etc/passwd | head -n 3)
翻譯成人話: 將/etc/passwd中的第一列的前三行取出來差牛,并且使用id指令查看信息
這里通過$(cut -d ':' -f 1 /etc/passwd | head -n 3)
預先取得了參數(shù)命锄,但是因為id只能接受一個參數(shù),因此它會在linux系統(tǒng)里報錯偏化。
-step 2 認識id
并不是管線命令的局限性
cut -d ':' -f 1 /etc/passwd | head -n 3 | id
最終你會發(fā)現(xiàn)脐恩,你查了自己!因為id
不是管線命令侦讨,它是沒有辦法接收|
前面的信息的驶冒。因此cut -d ':' -f 1 /etc/passwd | head -n 3 | id
的執(zhí)行效果 就等于 直接在linux命令行中輸入id
所執(zhí)行的結果。
這可腫么辦韵卤? xargs來了就有了辦法~
-
xargs -n
cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs -n 1 id
就可以順利得獲得相應用戶的詳細信息骗污,把它翻譯成人話就是:將/etc/passwd的第一列的前三行提出來然后通過xargs將此三行內容轉換成指令id的參數(shù)(考慮到id只能一個一個得接收參數(shù),因此使用了-n 1
使3個參數(shù)一個一個得傳遞到達) -
xargs -p
cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs -p -n 1 id
這里增加了-p
選項沈条,則在使用過程中需忿,被詢問到每個指令是否執(zhí)行! -
xargs -e
cut -d ':' -f 1 /etc/passwd | xargs -e'sync' -n 1 id
在我們下達 -e'sync'后蜡歹,在分析到sync這個字符串時屋厘,后面的stdin內容就會被xargs舍棄掉了