本节会介绍:cut sort wc uniq tee tr split等文档处理工具:
1、shell特殊符号:常用的符号如下:
*:表示零个或多个任意字符:
?:表示一个任意字符:
#:表示注释符号(shell脚本中常用):
\:表示脱义字符(特殊字符失去本来的含义):
$:与!结合使用,“!$”表示上一条命令中的最后一个变量:
; 分号,运行两个或两个以上的命令时使用:
~ 用户的家目录(root的家目录是/root/,普通用户的家目录是/home/username):
& 用这个命令可以某一条命令放在后台去运行:
[ ] 中括号为一个字符的区间,表示中间的字符的任意有一个:
[root@localhost ~]# ls *.txt # “*” 可以匹配出任意个任意字符:11.txt 222.txt 2.txt 3.txt[root@localhost ~]# ls ?.txt # “?” 只能表示一个任意字符:2.txt 3.txt[root@localhost ~]# c='$a$b' #用”单引号“也可以脱义:[root@localhost ~]# echo $c$a$b [root@localhost ~]# c=\$a\$b #”斜杠“也可脱义,作用同上:[root@localhost ~]# echo $c$a$b
2、cut命令:用于截取字符串:
格式:cut -d '分隔符' [ -cf ]n #n是正整数:
-d:指定分隔符:分隔符要用单引号:(结合-f使用)
-f:后面接第几个区块:
-c:后面接第几个字符:
[root@localhost ~]# cat /etc/passwd|cut -d ':' -f1 #-f要结合-d一起使用:binroot
[root@localhost ~]# cat /etc/passwd|cut -c1|head -n2rb
3、sort命令:用于排序:[ -n -r -u -kn1 -kn1,2 -t ]
格式:sort [-t '分隔符'] [options] [filename]
options:
-t:指定分隔符:一般结合-kn使用:
-n:使用纯数字方式排序:(默认字母和数字为0,会排序在前面,)
-r:逆向排序:
-kn1,n2:表示由n1到n2区间排序,如果只写kn1,表示只对n1字段排序:
sort不见任何选项,则从首字符开始,依次以ASCII码值进行比较,最后按升序输出:
[root@localhost ~]# cat 2.txt |sort #默认以ASCII码排序:^*,#$11111222222222
-n和nr:纯数字方式排序和逆向排序:
[root@localhost ~]# cat 2.txt |sort -n #以纯数字方式排序,特殊字符默认都为0:*#$2222111112222255555[root@localhost ~]# cat 2.txt |sort -nr #也是是以纯数字方式排序,不过时倒序显示:5555522222111112222#$*
4、wc命令:用于统计文档的行数、字符数和词数:
wc [ options ] filename
options:
-l:统计行数: list
-m:统计字符数: member
-w:统计词数: word
[root@localhost ~]# cat 3.txt #编写次文档内容做实验:123abc[root@localhost ~]# wc -l 3.txt #统计文档的行数:2 3.txt[root@localhost ~]# wc -w 3.txt #统计文档的词数:(单词):2 3.txt
[root@localhost ~]# wc -m 3.txt #统计当前文档的字符数,发现明明是六个字符,却显示8个:8 3.txt[root@localhost ~]# cat -A 3.txt #因为每行后面会有一个结束符‘$’:123$abc$
如上图:使用 wc -m 统计字符数后,会发现文档里明明六个字符,统计时却显示八个字符,这是因为每行都会有一个结束符存在:
5、uniq 去重复:用于统计文档中的重复的文字:
注:去重复之前需要先排序:一般需要结合sort使用,需要使用sort先排序:
uniq [ options ] filename
options:
-c:=count,在每列旁边显示该行重复的次数:
[root@localhost ~]# uniq -c 3.txt #首先直接去重复,发现不完整: 2 123 1 abc 1 def 1 456 1 123 1 456[root@localhost ~]# sort -n 3.txt |uniq -c #再次排序后再去重复,发现可以的: 1 abc 1 def 3 123 2 456
如上:我们第一次使用uniq去重复的时候,发现文字里还是有重复;所以需要使用sort先排序再去重复:如图例2:
6、tee:输出重定向:重定向的同时,也会输出显示在屏幕上:
[root@localhost ~]# sort -n 2.txt |uniq -c |tee a.txt #查看文件内容并重定向到a.txt: 1 11111:222 2 22222 1 33333 1 44444 1 55555[root@localhost ~]# cat 2.txt #查看文件内容:11111:2222222:1113333344444222222222255555[root@localhost ~]#
-a:追加的命令:
[root@localhost ~]# sort -n 2.txt |uniq -c |tee -a a.txt #再次追加文件内容: 1 2222:111 1 11111:222 2 22222 1 33333 1 44444 1 55555[root@localhost ~]# cat a.txt #查看文件内容,发现发生变化: 1 2222:111 1 11111:222 2 22222 1 33333 1 44444 1 55555 1 2222:111 1 11111:222 2 22222 1 33333 1 44444 1 55555
7、tr:替换字符:
[root@localhost ~]# cat 1.txt |head -n2|tr '[a-z]' '[A-Z]' #替换并再次查看文件内容:ROOT:X:0:0:ROOT:/ROOT:/BIN/BASHBIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN[root@localhost ~]# cat 1.txt |head -n2|tr 'r' 'R' #替换单个字符并查看文件内容:Root:x:0:0:Root:/Root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin
8、split:切割文件内容: -b -l
split -b filename #按大小来切割文档,默认单位为byte:可自定义单位:
split -l filename #按行数来切割文档:
[root@localhost test]# split -b 100 a.txt #按文件大小来划分:[root@localhost test]# ls1.txt a.txt xaa xab xac[root@localhost test]# split -b 100 a.txt tt #划分时可自定义文件名称:[root@localhost test]# ls1.txt a.txt ttaa ttab ttac[root@localhost test]# split -l 7 a.txt #按行数来划分:[root@localhost test]# ls1.txt a.txt xaa xab xac xad
9、特殊字符: “;” “||” “&&”
command1;command2 : 不论command1是否执行成功,都会执行command2:
command1 && command2 : 只有command1执行成功后,才会执行command2:
command1 | | command2 : 表示command1执行成功后,command2不执行,否则执行 command2:
[root@localhost test]# touch 1.txt;ls 1.txt #表示都执行:1.txt[root@localhost test]# ls1.txt[root@localhost test]# ls 1.txt && mkdir dir #表示第一条命令成功,才执行第二条命令:1.txt[root@localhost test]# ls1.txt dir[root@localhost test]# ls a.txt && mkdir dir2 #当第一条命令失败时,第二条也不执行:ls: cannot access a.txt: No such file or directory[root@localhost test]# ls1.txt dir
[root@localhost test]# ls a.txt || mkdir dir2 #表示第一条命令失败后,才会执行第二条命令:ls: cannot access a.txt: No such file or directory[root@localhost test]# ls1.txt dir dir2[root@localhost test]# ls 1.txt || mkdir dir3 #第一条命令成功了,则不会执行第二条命令:1.txt[root@localhost test]# ls1.txt dir dir2