博文大纲:
1)grep命令
2)cut命令
3)sort命令
4)uniq命令
5)tee命令
6)diff命令
7)paste命令
8)tr命令
注意:以下工具均不会对源文件进行修改,只是将结果输出!
1) grep命令
grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
常用选项:
-i:忽略大小写;
-v:反向查找;
-w:精确查找;
-o:只输出匹配的关键字;
-c:统计匹配到的次数;
-n:显示行号;
-r:逐层遍历目录进行查找;
-A:显示匹配行及后面多少行;
-B:显示匹配行及前面多少行;
-C:显示匹配行前后多少行;
-l:只列出匹配的文件名;
-L:列出不匹配的文件名;
-e:使用正则匹配;
-E:使用扩展正则匹配;
^key:以key开头的行;
key$:以key结尾的行;
^$:匹配空行;
--color=auto:将找到的关键字部分加上颜色显示;
2)cut命令
cut是列截取工具,用于列的截取。
常用选项:
-b:仅显示行中指定直接范围的内容;
-c:以字符为单位进行分割、截取;
-d:指定字段的分隔符,默认的字段分隔符为“TAB”;
-f:指定截取的区域,与-d一起使用;
举例:
# cut -d: -f1 1.txt #以“:”冒号分割,截取第1列内容
# cut -d: -f1,6,7 1.txt #以“:”冒号分割,截取第1,6,7列内容
# cut -c4 1.txt #截取文件中每行的第4个字符
# cut -c4-10 1.txt #截取文件中每行的第4-10个字符
# cut -c4- 1.txt #从第4个字符开始截取后面的所有字符
3)sort命令
sort主要用于排序,它将文件的每一行作为一个单位,从首字符向后,依次按ASCII 码值进行比较,左后将他们按升序输出。
常用选项:
-u:去除重复行(无论是否连续的重复行);
-r:降序排列,默认是升序;
-o:将排序的结果输出到文件中,类似基于重定向符号“>”;
-n:以数字排序,默认是按字符排序;
-t:分隔符;
-k:指定数字,表示第几列;
-b:忽略前导空格;
-R:随机排序,每次运行的结果都不同;
举例:
# sort -n -t: -k3 123.txt #将文件以冒号分割的第三列以数字的方式进行排序(升序)
# sort -nr -t: -k3 123.txt #同上,以降序进行排序
# sort -n 123.txt #以文件中的第一个字符以数字的方式进行排序
# sort -n 123.txt -o 123.sh #将排序的输出结果保存到123.sh
4)uniq命令
uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用。
常用的选项:
-i:忽略大小写;
-c:统计重复次数;
-d:只显示重复行;
5)tee命令
tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。
常用选项:
-a:向文件中重定向时使用追加模式;
-i:忽略中断(interrupt)信号。
6) diff命令
diff主要用于逐行比较文件的不同!
注意:diff描述两个文件不同的方式是告诉我们怎样改变第一个文件之后与第二个匹配!
常用选项:
-b:不检查空格;
-B:不检查空白行;
-i:不检查大小写;
-w:忽略所有的空格;
--normal:正常格式显示(默认);
-c:上下文格式显示;
-u:合并格式显示;
举例:
# cat file1
aaaa
111
hello world
222
333
bbb
]# cat file2
aaa
hello
111
222
bbb
333
world
1)正常显示
diff目的:file1如何改变才能和file2匹配
# diff file1 file2
1c1,2 #第一个文件的第1行需要改变才能和第二个文件的第1到2行匹配
< aaaa #小于号“<”表示左边文件(file1)内容
--- #分割符
> aaa #大于号“>”表示右边文件(file2)内容
> hello
3d3 #第一个文件的第3行删除后才能和第二个文件的第3行匹配
< hello world
5d4 #第一个文件的第5行删除后才能和第二个文件的4行匹配
< 333
6a6,7 #第一个文件的第6行增加内容后才能和第二个文件的第6到7行匹配
> 333 #需要增加的内容在第二个文件里是333和world
> world
2)上下文格式显示
# diff -c file1 file2
*** file1 2020-02-18 13:46:35.873209160 +0800
--- file2 2020-02-18 13:46:54.009174296 +0800
*************** #分割符
*** 1,6 **** #以***开头表示file1文件,1,6表示1到6行
! aaaa #!表示该行需要修改才能与第二个文件匹配
111
- hello world #-表示需要删除该行才能与第二个文件匹配
222
- 333 #-表示需要删除该行才能与第二个文件匹配
bbb
--- 1,7 ---- #以---开头表示file2文件,1,7表示1到7行
! aaa #表示第一个文件需要修改才能与第二个文件匹配
! hello #表示第一个文件需要修改才能与第二个文件匹配
111
222
bbb
+ 333 #表示第一个文件需要加上该行才能与第二个文件匹配
+ world #表示第一个文件需要加上该行才能与第二个文件匹配
3)合并格式显示
# diff -u file1 file2
--- file1 2020-02-18 13:46:35.873209160 +0800
+++ file2 2020-02-18 13:46:54.009174296 +0800
@@ -1,6 +1,7 @@ #以下是针对file1的改变,与file2相同
-aaaa #-表示减少,+表示增加
+aaa
+hello
111
-hello world
222
-333
bbb
+333
+world
4)比较目录的不同
# mkdir dir{1,2}
# touch dir1/file{1..5}
# touch dir2/file{1..3}
# touch dir2/test{1,2}
# echo 1111 > dir1/file1
# diff dir1 dir2
#默认则会比较相同文件的内容
diff dir1/file1 dir2/file1
1d0
< 1111
只在 dir1 存在:file4
只在 dir1 存在:file5
只在 dir2 存在:test1
只在 dir2 存在:test2
[root@localhost tmp]# diff -q dir1 dir2
#如果只需要比较两个目录里文件的不同,不需要进一步比较文件的内容,需添加-q选项
文件 dir1/file1 和 dir2/file1 不同
只在 dir1 存在:file4
只在 dir1 存在:file5
只在 dir2 存在:test1
只在 dir2 存在:test2
5)小技巧
有时我们需要以一个文件为标准,去修改其他文件,并且修改的内容较多,我们可以通过打补丁的方式完成。
#以下方式修改文件file1的内容与file2的内容一致
# diff file1 file2 > file.patch
#先找出文件的不同,然后输入到一个文件中(正常显示、上下文、合并的反射光hi都可以)
# patch file1 file.patch
patching file file1
#将不同的内容打补丁到文件中
# diff file1 file2
#没有返回结果则表示两个文件一致
7)paste命令
paste主要用于合并文件行。
常用选项:
-d:自定义间隔符,默认是tab;
-s:串行处理,非并行;
举例:
# cat file1
file1
8888
# cat file2
file2
9999
1111
# paste file1 file2 #默认以tab键进行分割
file1 file2
8888 9999
1111
# paste -d: file1 file2 #将:作为分割符
file1:file2
8888:9999
:1111
# paste -s file1 file2 #将file1、file2串行处理
file1 8888 #第一行是file1的内容
file2 9999 1111 #第二行是file2的内容
8) tr命令
tr用于字符转换、替换和删除,主要用于删除文件中控制字符或进行字符转换!
常用选项:
-d:删除所有属于第一字符集的字符;
-s:把连续重复的字符以单独一个字符表示;
常用的正则表达式
如图:
举例:
# tr -d '[:/]' < 123.txt #删除文件中的:和/
# cat 123.txt | tr -d '[:/]' #同上
# tr '[0-9]' '@' < 123.txt #将文件中的数字替换为@符号
# tr '[a-z]' '[A-Z]' < 123.txt #将文件中的小写字符替换为大写字符
# tr -s '[a-z]' < 123.txt #匹配文件中的小写字母并连续重复的压缩为一个
# tr -s '[a-z0-9]' < 123.txt #匹配文件中的小写字母与数字并将连续重复的小写字母或数字压缩为一个
# tr -d '[:digit:]' < 123.txt
# tr -d '[0-9]' < 123.txt #删除文件中的数字
# tr -d '[:blank:]' < 123.txt
# tr -d '[ ]' < 123.txt #删除文件所有中的(水平)空白字符
# tr -d '[:space: ]' < 123.txt #删除文件中所有的(水平或垂直)空白字符