Linux 之 Bash -- 管線命令

聲明: 我覺得今天的這篇文章就像一篇“工具”文而且很雞肋:歸納一些常用的管線命令和應用參數(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ù)送到屏幕去處理

tee 的工作流程(from 鳥哥)

舉個例子來認識它:
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舍棄掉了
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市月而,隨后出現(xiàn)的幾起案子汗洒,更是在濱河造成了極大的恐慌,老刑警劉巖父款,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溢谤,死亡現(xiàn)場離奇詭異,居然都是意外死亡憨攒,警方通過查閱死者的電腦和手機世杀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浓恶,“玉大人玫坛,你說我怎么就攤上這事“” “怎么了湿镀?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伐憾。 經(jīng)常有香客問我勉痴,道長,這世上最難降的妖魔是什么树肃? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任蒸矛,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘雏掠。我一直安慰自己斩祭,他們只是感情好,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布乡话。 她就那樣靜靜地躺著摧玫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绑青。 梳的紋絲不亂的頭發(fā)上诬像,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音闸婴,去河邊找鬼坏挠。 笑死,一個胖子當著我的面吹牛邪乍,可吹牛的內容都是我干的降狠。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼庇楞,長吁一口氣:“原來是場噩夢啊……” “哼喊熟!你這毒婦竟也來了?” 一聲冷哼從身側響起姐刁,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烦味,沒想到半個月后聂使,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡谬俄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年柏靶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溃论。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡屎蜓,死狀恐怖,靈堂內的尸體忽然破棺而出钥勋,到底是詐尸還是另有隱情炬转,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布算灸,位于F島的核電站扼劈,受9級特大地震影響,放射性物質發(fā)生泄漏菲驴。R本人自食惡果不足惜荐吵,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧先煎,春花似錦贼涩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至良风,卻和暖如春谊迄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烟央。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工统诺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疑俭。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓粮呢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钞艇。 傳聞我的和親對象是個殘疾皇子啄寡,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內容

  • 本文筆記源自這里——[實驗樓]歡迎大家在下面交流其中有問題的地方喜歡請點收藏,每日更新(全部已親自實踐). 一. ...
    東皇Amrzs閱讀 3,999評論 7 54
  • 查詢命令具體介紹:man/info 命令 計算器:bc 進行加減乘除操作 時間:date cal Tab鍵:補全命...
    Suavitygogo閱讀 397評論 0 0
  • 此篇文章內容是我很久以前在印象筆記中的一個知識總結哩照,大概122個Linux指令挺物。如今,寫出來就當再回顧一遍了飘弧。若有...
    StephenZhang01閱讀 1,072評論 0 5
  • 一识藤、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,753評論 0 10
  • 原文:http://blog.csdn.net/qwe6112071/article/details/508067...
    道素閱讀 452評論 0 1