shell指令碼 cut命令

2021-09-07 14:49:59 字數 3722 閱讀 1750

bash&shell系列文章:

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的示例。

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

[root@xuexi tmp]# cut -d" " -f2,4 abc.sh

name

00150djakldj;lajd;sla

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

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

[root@xuexi tmp]# cat abc.sh | tr -s " " | cut -d " " -f2,4

name mark

longshuai 56

gaoxiaofang 60

zhangsan 50

lisi 80

wangwu 90

djakldj;lajd;sla

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

[root@xuexi tmp]# cat abc.sh | tr -s " " | cut -d" " -f2,4 -s

name mark

longshuai 56

gaoxiaofang 60

zhangsan 50

lisi 80

wangwu 90

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

[root@xuexi tmp]# cat abc.sh | tr -s " " | cut -d" " -f2,4 -s --complement

no subjectid 備註

1001 不及格

2001 及格

3001 不及格

4001 及格

5001 及格

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

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

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

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

no 1 l

2 g3 z

4 l5 w

dja

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

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

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

0及

也可以按字元分隔。

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

0及

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

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

[root@xuexi tmp]# cut -b3-5,6-8 abc.sh  # 拼接在一起

name

longsh

gaoxia

zhangs

lisi 0

wangwu

akldj;

[root@xuexi tmp]# cut -b3-5,6-8 abc.sh --output-delimiter "," # 逗號分隔多段

na,me

lon,gsh

gao,xia

zha,ngs

lis,i 0

wan,gwu

akl,dj;

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

[root@xuexi tmp]# cut -d" " -f3- abc.sh -s    # 輸出第三欄位和後面所有的內容

subjectid mark 備註

00156 不及格

00160 及格

00150 不及格

00180 及格

00190 及格

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

[root@xuexi tmp]# cut -d" " -f3-5,4-6 abc.sh -s   # 範圍交叉

subjectid mark 備註

00156 不及格

00160 及格

00150 不及格

00180 及格

00190 及格

如果範圍順序無序,則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 及格

shell入門 cut命令

命令 cut 選項 d f 指定第幾段由 分割符 分割的段 c 指定第幾個字元 說明 選取命令,選取一段資料中我們想要的,一般是針對每行來分析選取的 root wangshaojun cat etc passwd root x 0 0 root root bin bash bin x 1 1 bin...

Shell基礎之 cut命令

cut命令用於從標準輸入檔案或文字檔案中按域或行提取文字 cut option file cut命令選項及其意義 c 指定提取的字元數或字元範圍 f 指定提取的域數或域範圍 d 改變域分隔符 cut c後跟數字表示字元數或字元範圍,共有三種表示方式 cn 表示第n個字元 cn m 表示n m個字元 ...

shell 的cut 命令用法

和awk差不多的功能 例1 a echo root x 0 0 root root bin bash cut d f 1,5 shuohailhl shuohailhl pc cygdrive d echo a root root 上面的例子中,把 root x 0 0 root root bin ...