Linux下cut命令用法詳解
原創:frozen_sucker(冰棍)
有時我們經常會遇到這樣一些問題:有一頁電話號碼薄,上面按順序規則地寫著人名、家庭住址、電話、備忘等,此時我們只想取出所有人的名字和其對應的電話號碼,你有幾種方法可以實現呢?
以下內容歡迎轉載,但請保留作者名號及出處,謝謝!
原創:frozen_sucker
連結:http://blog.csdn.net/Frozen_fish/archive/2008/04/08/2260804.aspx
確實這種縱向定位的方式用常規辦法難以實現,這時,cut就可以大顯身手了。
What’s cut?
子曰:cut命令可以從一個文字檔或者文字資料流中提取文本列。
命令用法:
cut -b list [-n]
cut -c list
cut -f list [-d delim][-s]
l 上面的-b、-c、-f分別表示位元組、字元、欄位(即byte、character、field);
l list表示-b、-c、-f操作範圍,-n常常表示具體數字;
l file表示的自然是要操作的文字檔的名稱;
l delim(英文全寫:delimiter)表示分隔字元,預設情況下為TAB;
l -s表示不包括那些不含分隔字元的行(這樣有利於去掉注釋和標題)
上面三種方式中,表示從指定的範圍中提取位元組(-b)、或字元(-c)、或欄位(-f)。
範圍的表示方法:
N |
只有第N項 |
N- |
從第N項一直到行尾 |
N-M |
從第N項到第M項(包括M) |
-M |
從一行的開始到第M項(包括M) |
- |
從一行的開始到結束的所有項 |
下面是執行個體,先以較簡單的“命令用法”中提及的第二條開始講起:
interrupts檔案中的字元排列非常齊整,正適合我們切豆腐。
但這裡我們只對兩個數字列感興趣,用法如下:
裡面還有一些不需要的內容,精減一下:
關於Regex的使用,請自行查閱相關資料。
合到一起:
哇,果然夠帥!!
不相鄰列的截選又應該如何做呢?
這種方式需要事先確定佔多少個字元位置,不僅麻煩,而且容易出錯。
下面的問題該怎麼去做?
這就是第二講:使用cut –f提取文本中的欄位。
cut –c主要是用來在固定字元位置或個數的文字檔中提取,對於上面的例子就顯得無能為力了。仔細觀察,發現passwd檔案有個規律,就是以冒號來區分不同的段的文本,於是。。。
怎麼樣,好玩吧~!
繼續,建立一個文字檔,名為a.txt,名字有點土,湊合著用吧。
A1、B1、C1所代表的行字元之間均以TAB分隔,D1卻是以空格來分開的。
看到-s的作用了嗎?(因為第一行不含有任何TAB字元,所以直接被剔除了),而最後一行(即D1行),是以空格區分間距,所以也不合要求。
多了個參數,這個我沒講,只要你的智商比範偉高一點點,就肯定能猜出來啦。^_^
好了,下面是最後一個用法的講解了:
因為虛擬終端下無法顯示漢字,所以我只好回到圖形下,就成這個白不垃圾的樣子啦,忍忍吧,就快講完了。
在這個檔案中,每個漢字都是用半形空格分隔的。
用cut –c已經成功了,下面試試cut –b怎麼樣?
沒有反應,why?
原因在於漢字本身是雙位元組的,cut –c把漢字“我”當成一個字元來處理,而cut –b是以位元組來處理,把“我”拆成了兩個位元組,結果是字元被“切成兩半”,因此無法正常顯示。
原因找到了,要怎麼辦才好呢?
耶!!!搞定。
OK,all is done。就到這裡吧,休息,休息。。。