Linux下如何剪断你的千丝万缕
命令是:cut
从字面上来看,cut 命令与剪切有关,实际也是如此,cut 命令将一个字符串按某种特定的方式进行裁剪提取并输出。结合其它命令,cut 可以很轻松的提取其它命令输出结果中我们所需要的内容。
cut基本格式:
cut 选项 文件
命令选项:
-b: 以字节为单位进行分割;
-c: 以字符为单位进行分割;
-d: 自定义分割符,默认是制表符;
-f: 以区域为单位进行分割,常与 -d 选项一起使用;
-n: 取消分割多字节字符,仅与 -b 选项同用;
从对 cut 命令的选项描述来看,该命令一般通过三种单位进行分割:字节、字符、域 。下面详细介绍这三种分割方式。
以字节为单位进行分割
假如现在有个 test1.txt 文件,文件内容如下:
$ cat test1.txt
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
1.提取每一行的第 1 个字节
命令如下:
$ cut -b 1 test1.txt
M
T
W
T
F
S
S
2.提取每一行的第 2 、4 、6 个字节
命令如下:
$ cut -b 2,4,6 test1.txt
ody
usa
ens
hrd
rdy
aud
udy
3.提取每一行的第 3、4、5、6 个字节
如果字节是连续的,我们就没必要一个个列出来,只需使用短横杠 - 将区间列出来即可,如下:
$ cut -b 3-6 test1.txt
nday
esda
dnes
ursd
iday
turd
nday
4. 提取第 1、2、3 及 6 个字节
命令如下 :
$ cut -b 1-3,6 test1.txt
Mony
Tuea
Weds
Thud
Friy
Satd
Suny
5. 提取前 3 个字节或第 3 个字节之后的内容
命令如下:
$ cut -b -3 test1.txt
Mon
Tue
Wed
Thu
Fri
Sat
Sun
$ cut -b 3- test1.txt
nday
esday
dnesday
ursday
iday
turday
nday
以字符为单位进行分割
字节与字符的差别是啥?举个例子吧,a 这是一个字节,而 啊 这是一个字符,明白了吧?对于汉字而言,每一个汉字都是一个字符。
假如现在有个 test2.txt 文件,它的内容如下:
$ cat test2.txt
良许真帅
守望文章写得好
小灰仓鼠很可爱
明哥真爷们
如果以字节为单位分割,那效果是如何的呢?
$ cut -b 2 test2.txt
▒
▒
▒
▒
很明显,一堆乱码。如果要正确分割字符,那么就需要 -nb 或 -c 选项。
$ cut -nb 2 test2.txt
许
望
灰
哥
$ cut -c 2 test2.txt
许
望
灰
哥
以域为单位进行分割
域是什么?我们以 /etc/passwd 文件为例说明。
$ cat /etc/passwd | head -n 5
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
从 passwd 文件可以明显看出来,每个用户的各项信息是用冒号 : 进行隔开,所隔开的每项内容都可以称为「域」,而冒号称为「间隔符」。
现在,我们想要提取每一行的第一个域,命令如下:
$ cat /etc/passwd | head -n 5 | cut -d : -f 1
root
bin
daemon
adm
lp
在这里,我们用 -d 选项来指定冒号 : 为间隔符,然后再用 -f 选项来指定要提取的域。当然,间隔符不仅仅是冒号,我们还可以指定其它符号,比如逗号,空格,等等。
但是,如果一个字符串里如果两个单词间有多个空格,则 cut 命令将无法分辨,所以这也是 cut 命令的缺陷。