Linux小工具(grep+cut+sort+uniq+tee+diff+patch+paste+tr)

Posted 何翰宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux小工具(grep+cut+sort+uniq+tee+diff+patch+paste+tr)相关的知识,希望对你有一定的参考价值。

文章目录


1. grep

grep是一个行过滤工具,可以根据指定的关键词进行过滤
语法:grep [选项] ‘关键字’ [文件名]

常用选项:

	-i: 不区分大小写
    -v: 查找不包含指定内容的行,反向选择
    -w: 按单词搜索
    -o: 打印匹配关键字
    -c: 统计匹配到的行数
    -n: 显示行号
    -r: 逐层遍历目录查找
    -A: 显示匹配行及后面多少行	
    -B: 显示匹配行及前面多少行
    -C: 显示匹配行前后多少行
    -l:只列出匹配的文件名
    -L:列出不匹配的文件名
    -e: 使用正则匹配
    -E:使用扩展正则匹配
    ^key:以关键字开头
    key$:以关键字结尾
    ^$:匹配空行

2. cut

cut是截取工具,用于列的截取
语法:cut [选项] [文件名]

常见选项

-c:	以字符为单位进行分割,截取
-d:	自定义分隔符,默认为制表符\\t
-f:	与-d一起使用,指定截取哪个区域(哪一列)

示例

[root@lamp tmp]# cut -d : -f1 test.txt # 以冒号分割,截取第1列内容

[root@lamp tmp]# cut -d : -f2 test.txt # 以冒号分割,截取第2列内容

[root@lamp tmp]# cut -d : -f1,2,4 test.txt # 以冒号分割,截取底2列和第3列的内容

[root@lamp tmp]# cut -c5 test.txt # 截取每行第5个字符

[root@lamp tmp]# cut -c1-5 test.txt # 截取1到5个字符

[root@lamp tmp]# cut -c2-6 test.txt # 截取2到6个字符

[root@lamp tmp]# cut -c6- test.txt # 截取从第6个字符往后的所有字符
x:0:0:ROOT:/root:/bin/bash
:1:1:bin:/bin:/sbin/nologin
n:x:2:2:daemon:/sbin:/sbin/nologin
:3:4:adm:/var/adm:/sbin/nologin
4:7:lp:/var/spool/lpd:/sbin/nologin

3. sort

sort工具用于排序;它将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

语法:sort [选项] [文件名]

常用选项

-u :去除重复行
-r :降序排列,默认是升序
-o : 将排序结果输出到文件中,类似重定向符号>
-n :以数字排序,默认是按字符排序
-t :分隔符
-k :第N列
-b :忽略前导空格。
-R :随机排序,每次运行的结果均不同

按照用户uid升序排序

[root@lamp tmp]# cat test.txt 
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@lamp tmp]# sort -n -t: -k3 test.txt
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@lamp tmp]# cat file1
444
ddd
aaa
aaa
333
bbb
bbb
111

[root@lamp tmp]# sort -nu file1
ddd
111
333
444

4. uniq

uniq用于去除重复的行

语法:uniq [选项] [文件名]

常用选项

-i: 忽略大小写
-c: 统计重复行次数
-d:只显示重复行
[root@lamp tmp]# cat file1 # 统计重复行次数
444
ddd
aaa
aaa
333
bbb
bbb
111

[root@lamp tmp]# uniq -c file1 # 只显示重复行
      1 444
      1 ddd
      2 aaa
      1 333
      2 bbb
      1 111
      1 
[root@lamp tmp]# uniq -cd file1
      2 aaa
      2 bbb

5. tee

tee工具是从标准输入读取并写入到标准输出和文件
即:双向覆盖重定向(屏幕输出|文本输入)

常用选项

-a: 双向追加重定向

[root@lamp tmp]# echo hello | tee file1
hello
[root@lamp tmp]# cat file1
hello
[root@lamp tmp]# echo 999|tee -a file1
999
[root@lamp tmp]# cat file1
hello
999

6. diff

diff工具用于逐行比较文件的不同
注意:diff描述两个文件不同的方式是告诉我们怎样改变第一个文件之后与第二个文件匹配

语法:diff [选项] [文件1] [文件2]

常用选项

-b:不检查空格
-B:不检查空白行
-i:不检查大小写
-w:忽略所有的空格
--normal:正常格式显示(默认)
-c:上下文格式显示
-u:合并格式显示

比较两个普通文件异同,文件准备

[root@lamp tmp]# cat file1
aaaa
111
hello world
222
333
bbb
[root@lamp tmp]# cat file2
aa
hello
111
222
bbb
333
world
[root@lamp tmp]# 

1)正常显示

[root@lamp tmp]# clear
[root@lamp tmp]# diff file1 file2
1c1,2 # 第一个文件的第1行需要改变(c=change)才能和第二个文件的第1到2行匹配	
< aaaa # 小于号"<"表示左边文件(file1)文件内容
--- # ---表示分隔符
> aa  # 大于号">"表示右边文件(file2)文件内容
> hello
3d3 # 第一个文件的第3行删除(d=delete)后才能和第二个文件的第3行匹配
< hello world
5d4 # 第一个文件的第5行删除后才能和第二个文件的第4行匹配
< 333
6a6,7 # 第一个文件的第6行增加(a=add)内容后才能和第二个文件的第6到7行匹配
> 333 # 需要增加的内容在第二个文件里是333和world
> world

2)上下文格式显示

[root@lamp tmp]# diff -c file1 file2
 # 前两行主要列出需要比较的文件名和文件的时间戳;文件名前面的符号***表示file1,---表示
*** file1	2022-07-26 21:48:45.771150441 +0800
--- file2	2022-07-26 21:48:56.349150967 +0800
***************
*** 1,6 **** # 以***开头表示file1文件,1,6表示1到6行
! aaaa # !表示该行需要修改才与第二个文件匹配
  111
- hello world # -表示需要删除该行才与第二个文件匹配
  222
- 333 # -表示需要删除该行才与第二个文件匹配
  bbb
--- 1,7 ---- # 以---开头表示file2文件,1,7表示1到7行
! aa # 表示第一个文件需要修改才与第二个文件匹配
! hello # 表示第一个文件需要修改才与第二个文件匹配
  111
  222
  bbb
+ 333 # 表示第一个文件需要加上该行才与第二个文件匹配
+ world


3)合并格式显示

[root@lamp tmp]# diff -u file1 file2
前两行主要列出需要比较的文件名和文件的时间戳;文件名前面的符号---表示file1,+++表示file2
--- file1	2022-07-26 21:48:45.771150441 +0800
+++ file2	2022-07-26 21:48:56.349150967 +0800
@@ -1,6 +1,7 @@
-aaaa
+aa
+hello
 111
-hello world
 222
-333
 bbb
+333
+world

4)比较两个目录不同

# 默认情况下也会比较两个目录里相同文件的内容
[root@lamp tmp]# cat dir1/file1
aaaa
111
hello world
222
333
bbb
[root@lamp tmp]# cat dir2/file1
test

[root@lamp tmp]# diff dir1 dir2
diff dir1/file1 dir2/file1
1,6c1
< aaaa
< 111
< hello world
< 222
< 333
< bbb
---
> test
# 如果只需要比较两个目录里文件的不同,不需要进一步比较文件内容,需要加-q选项
[root@lamp tmp]# diff -q dir1 dir2
Files dir1/file1 and dir2/file1 differ

5)小技巧(patch)

有时候我们需要以一个文件为标准,去修改其他文件,并且修改的地方较多时,我们可以通过打补丁的方式完成。

[root@lamp tmp]# cat file1
aaaa
111
hello world
222
333
bbb
[root@lamp tmp]# cat file2
aa
hello
111
222
bbb
333
world
# 先找出文件不同,然后输出到一个文件
[root@lamp tmp]# diff -uN file1 file2 > file.patch
-u:上下文模式
-N:将不存在的文件当作空文件
2)将不同内容打补丁到文件
[root@lamp tmp]# patch file1 file.patch
patching file file1
# 测试验证
[root@lamp tmp]# diff file1 file2
[root@lamp tmp]# cat file1
aa
hello
111
222
bbb
333
world
[root@lamp tmp]# cat file2
aa
hello
111
222
bbb
333
world

7. paste

paste工具用于合并文件行

常用选项

-d:自定义间隔符,默认是tab
-s:串行处理,非并行
[root@lamp tmp]# cat test1
aaa
bbb 111
222
[root@lamp tmp]# cat test2
hello world
[root@lamp tmp]# paste test1 test2
aaa	hello world
bbb 111	
222	
[root@lamp tmp]# paste -d : test1 test2
aaa:hello world
bbb 111:
222:
[root@lamp tmp]# paste -d : -s test1 test2
aaa:bbb 111:222
hello world

8. tr工具

tr用于字符转换,替换和删除;主要用于删除文件中控制字符或进行字符转换

用法

用法1:命令的执行结果交给tr处理,其中string1用于查询,string2用于转换处理
# [命令]|tr  'string1'  'string2'
用法2:tr处理的内容来自文件,记住要使用"<"标准输入
# tr  'string1'  'string2' < [文件]

用法3:匹配string1进行相应操作,如删除操作
# tr [选项]'string1' < filename

常用选项

-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串
[root@lamp tmp]# cat tmp.txt # 测试使用
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/ROOT:/sbin/nologin
112345
aabvd


123445 aabccde
hello	world

====================================分割线=======================================

# tr -d '[:/]' < tmp.txt 删除文件中的 :和 /
# cat tmp.txt | tr -d '[:/]' 删除文件中的 :和 /
# tr '[0-9]' '@' < tmp.txt 将文件中的数字替换成@符号
# tr '[a-z]' '[A-Z]' < tmp.txt 将文件中的小写字符替换成大写字母
# tr -s '[a-z]' < tmp.txt 匹配小写字母,把连续相同的小写字母压缩成一个
# tr -s '[a-z0-9]' < tmp.txt 匹配小写字母和数字并将连续重复的替换成一个
# tr -d '[:digit:]' < tmp.txt 删除文件中的数字
# tr -d '[:blank:]' < tmp.txt 删除水平空白(空格、\\t)
# tr -d '[:space:]' < tmp.txt 删除所有水平和垂直空白(换行、空格、\\t)



以上是关于Linux小工具(grep+cut+sort+uniq+tee+diff+patch+paste+tr)的主要内容,如果未能解决你的问题,请参考以下文章

关于cut sort grep等几个命令在实际问题的小应用

Liunx 中sed、grep、cut、sort、tee、diff 、paste命令

linux基础篇07,linux文本处理cat more less head tail sort uniq grep cut jion sed awk

shell编程之文本小工具

小工具的使用

Linux好用的管道命令