8.10 shell特殊符号cut命令
语法: cut -d '分隔字符' [-cf] n
-d 后面指定分隔符,单引号引起来,必须是单个字符
-f 指定第几段,可以跟多个数字,用逗号隔开
-c 后面只有一个数字,表示截取第几个字符
-d 后面跟分隔字符,这里使用冒号:作为分隔字符,-f 1 就是截取第一段,-f 和 1直接的空格可有可无。-d 和 -c 不能同时使用
[root@thinkpad tmp]# cut -d ':' -f 3 passwd 【-d 后面直接加分隔符,不用空格】
[root@thinkpad tmp]# cut -d:-f 3 passwd 【空格之后用单引号引起来】
[root@thinkpad tmp]# cut -d: -f 3,6,5 passwd 【截取两段的时候,用逗号隔开,数字顺序可以颠倒,但显示的结果以实际为准,比如-f 3,6,5 显示的结果是 -f 3,5,6 】
#echo '1 2 3' > 1.txt
#cut -d ' ' -f 2 1.txt 【分隔符是空格,需要指定空格,用单引号引起来】
所以,建议-d后面跟单引号,避免出现问题。养成习惯。
-c 截取字符,包括字母,数字,符号
-c 后面跟一个数字,表示截取第几个字符
-c 后面跟一个区间
-c 后面跟几个数字,表示截取多个
[root@thinkpad tmp]# cut -c1,2,5,9 passwd
[root@thinkpad tmp]# cut -c 6-10 passwd
8.11 sort_wc_uniq命令
sort [-t 分隔符] [-kn1,n2] [-nru]
此处n1<n2
-t 后跟分隔符,作用和cut -d 一样,
-n 使用纯数字排序,只针对数字,如果是字母,会按0处理
-r 反向排序
-u 去重复
-kn1,n2 由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序,cut区间用减号表示,sort用逗号,表示。
NOTE: -t 和 -k 要在一起用;sort不加任何选项,按照ACSII进行排序,并非单纯的数字或者字母
[root@localhost ~]# head -n5 /etc/passwd
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
sort不加任何选项,从首字母排序,按ASCII码值比较,升序输出。
[root@localhost ~]# head -n5 /etc/passwd |sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
-t 跟分隔符, -k 后面跟数字,表示按照第几个字符串排序;-n表示使用纯数字排序
[root@localhost ~]# head -n5 /etc/passwd |sort -t: -k3 -n
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
-k3,5 表示第3到第5区域级的字符串排序,-r表示反向排序
第三段到第五段,先排第三段,如果第三段中有多行一样,那么就按第四段排,如果第四段也有多行一样,就按第五段排。
[root@localhost ~]# head -n5 /etc/passwd |sort -t: -k3,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
[root@localhost ~]# head -n5 /tmp/passwd |sort -t: -k3 -n
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
-n 和 -u 一起用,sort会吧文档中的字母看成是0
#echo
[root@localhost ~]# cut -d: -f1 /etc/passwd |sort -n -u
root
#vim 1.txt
1
1
2
2
3
3
4
4
ab
bc
ef
#sort -n 1.txt 【数字大小排序,字母按0排序,若文档没有数字,所有字符会看成0】
ab
bc
ef
1
1
2
2
3
3
4
4
#sort -u 1.txt 【去重复,并不能知道重复了多少,哪里重复】
1
2
3
4
ab
bc
ef
#sort -nu 1.txt 【把所有的字母当做0处理,去重复之后显示最上面的一个】
ab
1
2
3
4
NOTE:文档中如果有一行全是标点符号,如果 -n 排序,则会显示在第一行。
,.,.,..,.,...
ab
bc
ef
1
1
下面省略
排序以后直接重定向>大湿兄
sort 1.txt -o 1.txt
sort 1.txt |tee 1.txt
8.12 tee_tr_split命令
tr 命令
用于替换字符,但是只是显示在屏幕上,并不会真正的替换文本文档本身。
-d 删除某个字符
-s 把重复的字符去掉
tr '[a-z]' '[A-Z]' 小写变大写
替换一个字符
#echo “abcdefg" |tr 'abcdefg' 'ABCD123' 【前后一一对应要替换的字符】
#echo "abcddsfd" |tr 'ds' 'DS'
abcDDSfD 【并没有顺序,会被识别成单个字符】
tr左边和右边如果长度不匹配时。
-
左边比右边少,首先会一一替换,比如左边为abc, 右边为 1234,这样,a替换为1,b替换为2,c替换为3,右侧的4是多余的
-
左边比右边多,首先会一一替换,比如左边为abc,右边为12,这样,a替换为1,b替换为2,c替换为2,也就是说多出来的字符全部替换为右侧最后面那个字符。
使用重定向命令,可以使得到的结果定向到文档中
[root@thinkpad tmp]# cat 1.txt |tr [a-z] [A-Z] |tee 1.txt
33333
44444
AA
BB
CC
DD
[root@thinkpad tmp]# cat 1.txt
33333
44444
AA
BB
CC
DD
split 命令 记住-b -l 选项
用于切割文档,
-b 依据大小来分隔文档,单位byte
-b 50m mb大小
-l 依据行数来分隔文档
mkdir split_dir
cd !$
cd split_dir
mv /tmp/passwd /etc/passwd
cp /etc/passwd ./
split -b 500 passwd
ll
total 16
-rw-r--r--. 1 root root 1466 Feb 11 18:46 passwd
-rw-r--r--. 1 root root 500 Feb 11 18:46 xaa
-rw-r--r--. 1 root root 500 Feb 11 18:46 xab
-rw-r--r--. 1 root root 466 Feb 11 18:46 xac
如果split不指定目标文件名,会以xaa,xab....这样的文件名来存取切割后的文件。可以指定目标文件名。
split -b 500 passwd 123
ll
total 28
-rw-r--r--. 1 root root 500 Feb 11 18:49 123aa
-rw-r--r--. 1 root root 500 Feb 11 18:49 123ab
-rw-r--r--. 1 root root 466 Feb 11 18:49 123ac
-rw-r--r--. 1 root root 1466 Feb 11 18:46 passwd
-rw-r--r--. 1 root root 500 Feb 11 18:46 xaa
-rw-r--r--. 1 root root 500 Feb 11 18:46 xab
-rw-r--r--. 1 root root 466 Feb 11 18:46 xac
#split -l 10 passwd
#wc -l
27 passwd
10 xaa
10 xab
7 xac