cut命令是Unix下的一個命令行程序。cut命令是以行為單位來處理的。cut命令處理的是標准輸入,所以可以結合管道來進行文本的處理。
cut option… [file]…
cut命令的option部分可以是如下的一些選項:
-b, --bytes=LIST 選擇指定數目LIST的字節
-c, --characters=LIST 選擇指定數目LIST的字符
-d, --delimiter=DELIM 使用DELIM作為內容的分隔符,而不是使用默認的制表符(tab)作為分隔符
-f, --fields=LIST 選擇LIST指定的LIST部分內容,輸出選中的內容,並且如果字符沒有包含分隔符,則也同樣輸出,除非指定了-s選項
-n 和-b一起使用,表示在選擇字節的時候,對於多字節的字符不進行分隔,多字節的字符被看作一個字節
-s, --only-delimited 不輸出不包含分隔符的行
--output-delimiter=STRING 使用STRING作為輸出內容中的分隔符,而不是使用原來標准輸入中的分隔符。
Note:對於選項-b, -c, -f,只能在一個命令被指定其中的一項。
命令結果的輸出的順序和待處理數據在輸入時的順序是一樣的。
對於一個LIST,可以是一個范圍,也可以是多個由逗號分隔的多個范圍。
LIST的格式:
N 表示指定N個數據單元,計數從1開始
N- 從第N個數據單元開始到行結束
N-M 從第N個數據單元到第M個數據單元(包括)
-M 從行的開始到底M個數據單元(包括)
其中的數據單元可以是:字節,字符,數據塊
Note:如果命令中沒有指定FILE或者FILE是"-",則默認是讀取標准輸入。
在Linux下環境變量PATH中包含了由”:”分隔的變量的查找路徑,假設我們需要截取其中的其中的第二個路徑,則可以使用如下的方法:
echo $PATH | cut -d ':' -f 2
如果需要截取PATH變量中從第二個路徑開始到結束的所有內容,可以使用如下的方法:
echo $PATH | cut -d ':' -f 2-
如果需要截取內容從開始到第3部分的內容,則可以使用如下的命令:
echo $PATH | cut -d ‘:’ -f –3
如果是截取從第2部分到第3部分的內容,則可以使用如下的命令:
echo $PATH | cut -d ':' 2-3
如果碰到一樣是不包含任何分隔符的,那麼實際上這一樣我們可能不需要任何處理,cut默認是會原樣輸出的,如果你不需要它們輸出,
則可以使用選項’-s’來阻止那些不包含指定分隔符的行:
echo $PATH | cut -s -d ':' -f 3
上述的-d選項可以用於有明顯的分隔符存在的情況下使用,在格式明顯的文本行處理中可以方便的對行進行截取。除了利用分隔符來截取分隔文本,對於沒有分隔格式的字符文本還可以進行指定字符個數的截取,那就是-c選項了:
取出一行文本中的第3個字節:
echo 'hello' | cut -c 3
同樣的,如果需要輸出指定范圍內的字符,則可以使用n-m的方式指定范圍
echo 'hello' | cut -c -2 #輸出行開始到第2個字符的內容 echo 'hello' | cut -c 2-3 #輸出第2到3個字符 echo 'hello' | cut -c 2- #輸出從第二字符開始到行結束的內容
在輸出的時候,如果需要指定一種另外的分隔符來分隔輸出的內容,以替代原來的分隔符,則可以使用--output-delimiter來處理
echo $PATH | cut -d ':' -f 1- --output-delimiter='*'
則輸出的PATH變量就是以*作為分隔符,而不是使用:來作為分隔符,是不是很方便?
想象一下,如果cut命令和Vim配合使用,是不是可以完成很多霸氣的操作呢,嘻嘻!且看:
假設我在Vim中正在編輯這樣的文本:
我想把分隔數字的*改成冒號:,怎麼辦呢?一個一個改?,你或許會想到在Vim下的模式替換來處理,這確實是一個好方法。如果Vim結合cut命令來處理,也可以達到異曲同工的效果:
使用Vim下的模式替換命令:
Shift+V #選中當前的行 :s/\*/:/g #使用s命令進行替換,由於*在Vim中是由特殊含義的,需要使用反斜槓來轉義
使用cut命令來處理:
Shift+V #選中光標所在的行 :!cut -d '*' -f 1- --output-delimiter=':'
兩個命令的執行結果都一樣,變成這樣了:
所以,cut命令配合Vim,也可以是一種有效的文本編輯的方法。這不也是Unix下的KISS模式的一種體現嗎?