shell指令碼--cut命令,shell指令碼--cut

來源:互聯網
上載者:User

shell指令碼--cut命令,shell指令碼--cut

本文目錄:
1.1 選項說明
1.2 按欄位篩選
1.3 使用--complement
1.4 按位元組或字元分割
1.5 使用--output-delimiter
1.6 cut中的範圍指定

1.1 選項說明

cut命令將行按指定的分隔字元分割成多列,它的弱點在於不好處理多個分隔字元重複的情況,因此經常結合tr的壓縮功能。

-b:按位元組篩選;
-n:與"-b"選項連用,表示禁止將位元組分割開來操作;
-c:按字元篩選;
-f:按欄位篩選;
-d:指定欄位分隔符號,不寫-d時的預設欄位分隔符號為"TAB";因此只能和"-f"選項一起使用。
-s:避免列印不包含分隔字元的行;
--complement:補足被選擇的位元組、字元或欄位(反向選擇的意思或者說是補集);
--output-delimiter:指定輸出分割符;預設為輸入分隔字元。

假設/tmp/abc.sh中下面所示的內容。注意:第2行到第5行每列不是都以單個空格分隔的,有的地方重複了幾個空格,有的地方只有一個空格,也就是說,常值內容不是很規則。並且最後一行完全沒有空格。

[root@xuexi tmp]# cat abc.sh NO Name SubjectID Mark 備忘1  longshuai 001  56 不及格2  gaoxiaofang  001 60 及格3  zhangsan 001 50 不及格4  lisi    001   80 及格5  wangwu   001   90 及格djakldj;lajd;sla

下面是cut的樣本。

1.2 按欄位篩選

在abc.sh中有5個欄位。篩選出第二欄位name列和第4欄位mark列。使用空格作為分隔字元。

[root@xuexi tmp]# cut -d" " -f2,4 abc.shName 001 50djakldj;lajd;sla

可以看到,輸出的是亂七八糟的非預期結果。原因就是分隔字元空格在分隔的地方重複了多次。所以想要正確顯示結果,需要把重複空格處理掉。

可以使用tr工具來壓縮連續字元。

[root@xuexi tmp]# cat abc.sh | tr -s " " | cut -d " " -f2,4Name Marklongshuai 56gaoxiaofang 60zhangsan 50lisi 80wangwu 90djakldj;lajd;sla

但是輸出中的最後一行中完全沒有定界符的行也輸出了,這需要使用-s來取消這樣的輸出。

[root@xuexi tmp]# cut -d" " -f2,4 abc.sh -sName Marklongshuai 56gaoxiaofang 60zhangsan 50lisi 80wangwu 90

1.3 使用--complement

輸出除了第2欄位和第4欄位其餘的所有欄位。

[root@xuexi tmp]# cut -d" " -f2,4 abc.sh -s --complementNO SubjectID 備忘1 001 不及格2 001 及格3 001 不及格4 001 及格5 001 及格

1.4 按位元組或字元分割

英文和阿拉伯數字是單位元組字元,中文是雙位元組字元,甚至是3位元組字元。

使用-b來按位元組篩選,使用-c按字元分割。

注意,按位元組或字元分割時將不能指定-d,因為-d是劃分欄位的。

[root@xuexi tmp]# cut -b1-3 abc.sh   # 篩選第1-3個位元組的內容NO 1 l2 g3 z4 l5 wdja

由於篩選中文,結果中出現亂碼。

[root@xuexi tmp]# cut -b20 abc.sh  

所以"-b"選項需要結合"-n"選項,以禁止"-b"選項將多位元組的字元強行分割導致亂碼。

[root@xuexi tmp]# cut -n -b20 abc.sha不0及

也可以按字元分隔。

[root@xuexi tmp]# cut -c20 abc.sh    a不0及

1.5 使用--output-delimiter

使用"--output-delimiter"指定輸出分隔字元。

使用-b或者-c分隔了多段字元時,可以使用--output-delimiter,否則這些多段將拼接在一起。

[root@xuexi tmp]# cut -b3-5,6-8 abc.sh  # 拼接在一起 Name longshgaoxiazhangslisi 0wangwuakldj;[root@xuexi tmp]# cut -b3-5,6-8 abc.sh --output-delimiter ","   # 逗號分隔多段 Na,me lon,gshgao,xiazha,ngslis,i 0wan,gwuakl,dj;

1.6 cut中的範圍指定

可以使用"N-"、"N-M"和"-M"分別表示每行N字元(或位元組或欄位)後的所有內容、N-M段內容和M段之前的內容。注意包括N和M的邊界。

[root@xuexi tmp]# cut -d" " -f3- abc.sh -s    # 輸出第三欄位和後面所有的內容SubjectID Mark 備忘001 56 不及格001 60 及格001 50 不及格001 80 及格001 90 及格

範圍交叉時,不會重複輸出。比如-f3-5,4-6,則輸出-f3-6。

[root@xuexi tmp]# cut -d" " -f3-5,4-6 abc.sh -s   # 範圍交叉SubjectID Mark 備忘001 56 不及格001 60 及格001 50 不及格001 80 及格001 90 及格

如果範圍順序無序,則Linux會先對範圍排序(升序)再輸出。例如-f4-6,2等價於-f2,4-6。

[root@xuexi tmp]# cut -d" " -f4-6,2 abc.sh -s           Name Mark 備忘longshuai 56 不及格gaoxiaofang 60 及格zhangsan 50 不及格lisi 80 及格wangwu 90 及格

回到系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/7521357.html註:若您覺得這篇文章還不錯請點擊下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.