文本常见处理工具

介绍了一些常用的文本处理工具,具体使用可以查看 首页-》相关站点-》linux命令大全

文本常见处理工具

1、文件内容查看命令

1.1 查看文本文件内容

1.1.1 cat

cat 可以查看文本内容
格式:

cat [OPTION]... [FILE]...

常见选项

-E:显示行结束符$
-A:显示所有控制符
-n:对显示出的每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行

1.1.2 nl

显示行号,相当于cat -b

1.1.3 tac

逆向显示文本内容

1.1.4 rev

将同一行的内容逆向显示

1.2 查看非文本文件内容

1.2.1 hexdump

[root@centos7blog ~]# echo {a..z} | tr -d ' '| hexdump -C
00000000  61 62 63 64 65 66 67 68  69 6a 6b 6c 6d 6e 6f 70  |abcdefghijklmnop|
00000010  71 72 73 74 75 76 77 78  79 7a 0a                 |qrstuvwxyz.|
0000001b

[root@centos7blog ~]# hexdump -C -n 512 /dev/sda
00000000  eb 63 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.c..............|
00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|
00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|
00000030  f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 01 8b  |.........|...t..|
00000040  4c 02 cd 13 ea 00 7c 00  00 eb fe 00 00 00 00 00  |L.....|.........|
00000050  00 00 00 00 00 00 00 00  00 00 00 80 01 00 00 00  |................|
00000060  00 00 00 00 ff fa 90 90  f6 c2 80 74 05 f6 c2 70  |...........t...p|
00000070  74 02 b2 80 ea 79 7c 00  00 31 c0 8e d8 8e d0 bc  |t....y|..1......|
00000080  00 20 fb a0 64 7c 3c ff  74 02 88 c2 52 be 05 7c  |. ..d|<.t...R..||
00000090  b4 41 bb aa 55 cd 13 5a  52 72 3d 81 fb 55 aa 75  |.A..U..ZRr=..U.u|
000000a0  37 83 e1 01 74 32 31 c0  89 44 04 40 88 44 ff 89  |7...t21..D.@.D..|
000000b0  44 02 c7 04 10 00 66 8b  1e 5c 7c 66 89 5c 08 66  |D.....f..\|f.\.f|
000000c0  8b 1e 60 7c 66 89 5c 0c  c7 44 06 00 70 b4 42 cd  |..`|f.\..D..p.B.|
000000d0  13 72 05 bb 00 70 eb 76  b4 08 cd 13 73 0d 5a 84  |.r...p.v....s.Z.|
000000e0  d2 0f 83 de 00 be 85 7d  e9 82 00 66 0f b6 c6 88  |.......}...f....|
000000f0  64 ff 40 66 89 44 04 0f  b6 d1 c1 e2 02 88 e8 88  |d.@f.D..........|
00000100  f4 40 89 44 08 0f b6 c2  c0 e8 02 66 89 04 66 a1  |.@.D.......f..f.|
00000110  60 7c 66 09 c0 75 4e 66  a1 5c 7c 66 31 d2 66 f7  |`|f..uNf.\|f1.f.|
00000120  34 88 d1 31 d2 66 f7 74  04 3b 44 08 7d 37 fe c1  |4..1.f.t.;D.}7..|
00000130  88 c5 30 c0 c1 e8 02 08  c1 88 d0 5a 88 c6 bb 00  |..0........Z....|
00000140  70 8e c3 31 db b8 01 02  cd 13 72 1e 8c c3 60 1e  |p..1......r...`.|
00000150  b9 00 01 8e db 31 f6 bf  00 80 8e c6 fc f3 a5 1f  |.....1..........|
00000160  61 ff 26 5a 7c be 80 7d  eb 03 be 8f 7d e8 34 00  |a.&Z|..}....}.4.|
00000170  be 94 7d e8 2e 00 cd 18  eb fe 47 52 55 42 20 00  |..}.......GRUB .|
00000180  47 65 6f 6d 00 48 61 72  64 20 44 69 73 6b 00 52  |Geom.Hard Disk.R|
00000190  65 61 64 00 20 45 72 72  6f 72 0d 0a 00 bb 01 00  |ead. Error......|
000001a0  b4 0e cd 10 ac 3c 00 75  f4 c3 00 00 00 00 00 00  |.....<.u........|
000001b0  00 00 00 00 00 00 00 00  c2 83 0a 00 00 00 80 20  |............... |
000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 00 aa  |!...(....... ...|
000001d0  29 82 8e fe ff ff 00 08  20 00 00 f8 5f 02 00 00  |)....... ..._...|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200

1.2.2 od

od 即 dump files in octal and other formats

[root@centos7blog ~]# echo {a..z} | tr -d ' '| od -t x
0000000 64636261 68676665 6c6b6a69 706f6e6d
0000020 74737271 78777675 000a7a79
0000033

[root@centos7blog ~]# echo {a..z} | tr -d ' '| od -t x1
0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70
0000020 71 72 73 74 75 76 77 78 79 7a 0a
0000033

[root@centos7blog ~]# echo {a..z} | tr -d ' '| od -t x1z
0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  >abcdefghijklmnop<
0000020 71 72 73 74 75 76 77 78 79 7a 0a                 >qrstuvwxyz.<
0000033

1.2.3 xxd

[root@centos7blog ~]# echo {a..z} | tr -d ' '| xxd
0000000: 6162 6364 6566 6768 696a 6b6c 6d6e 6f70  abcdefghijklmnop
0000010: 7172 7374 7576 7778 797a 0a              qrstuvwxyz.

2、分页查看文件内容

2.1 more

可以实现分页查看文件,可以配合管道实现输出信息的分页

格式

more [OPTIONS...] FILE...

选项:

-d: 显示翻页及退出提示

2.2 less

less 也可以实现分页查看文件或STDIN输出,less 命令是man命令使用的分页器

查看时有用的命令包括:

/文本 搜索 文本
n/N 跳到下一个 或 上一个匹配

3、显示文本前或后行内容

3.1 head

可以显示文件或标准输入的前面行
格式:

head [OPTION]... [FILE]...

选项:

-c #        指定获取前#字节
-n #        指定获取前#行,#如果为负数,表示从文件头取到倒数第#前
-#          同上

[root@centos7blog ~]# head -n 3 /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


3.2 tail

tail 和head 相反,查看文件或标准输入的倒数行

格式:

tail [OPTION]... [FILE]...

常用选项:

-c #            指定获取后#字节
-n #            指定获取后#行,如果#是负数,表示从第#行开始到文件结束
-#              同上
-f              跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新建同名文件,将无法继续跟踪文件
-F              跟踪文件名,相当于--follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文件

tailf 类似 tail –f,当文件不增长时并不访问文件,节约资源,CentOS8无此工具

[root@centos7blog ~]# tail -5 /var/log/messages
Dec 27 20:06:17 zabbix-web-server2 systemd-logind: Removed session 1.
Dec 27 20:06:17 zabbix-web-server2 systemd: Removed slice User Slice of root.
Dec 27 20:06:19 zabbix-web-server2 systemd: Created slice User Slice of root.
Dec 27 20:06:19 zabbix-web-server2 systemd: Started Session 4 of user root.
Dec 27 20:06:19 zabbix-web-server2 systemd-logind: New session 4 of user root.

#只查看最新发生的日志
[root@centos7blog ~]#tail -fn0 /var/log/messages
[root@centos7blog ~]#tail -0f /var/log/messages


#显示从第二行开始通过(-n +2)
[root@centos7blog ~]# df|tr -s ' ' | cut -d' ' -f5 | tr -d % | tail -n +2
0
0
2
0
10
14
0


[root@centos7blog ~]# df|tr -s ' ' | cut -d' ' -f5 | tr -d % | tail -n -2
14
0
[root@centos7blog ~]# df|tr -s ' ' | cut -d' ' -f5 | tr -d % | tail -n 2
14
0

3.3head+tail

指定显示某一行

[root@centos7blog ~]# seq 33 | head -6 | tail -1
6

#取IP行(没啥用,一般都是通过awk)
[root@centos7blog ~]# ifconfig | head -2 | tail -1
        inet 10.0.0.40  netmask 255.255.255.0  broadcast 10.0.0.255


4、按列抽取文本cut

cut 命令可以提取文本文件或STDIN数据的指定列
格式

cut [OPTION]... [FILE]...

常用选项

-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
  #:             第#个字段,例如:3
  #,#[,#]:      离散的多个字段,例如:1,3,6
  #-#:          连续的多个字段, 例如:1-6
  混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定输出分隔符

[root@centos7blog ~]# cut -d: -f3-5,7 /etc/passwd | head -2
0:0:root:/bin/bash
1:1:bin:/sbin/nologin

[root@centos7blog ~]# cat /etc/passwd | head -2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

#取分区利用率
[root@centos7blog ~]# df|tr -s ' ' | cut -d' ' -f5 | tr -d % | tail -n +2

[root@centos7blog ~]# df|tr -s ' ' '%'|cut -d% -f5 | tail -n +2


5、合并多个文件 paste

paste 合并多个文件同行号的列到一行
格式

paste [OPTION]... [FILE]...

常用选项:

-d  #分隔符:指定分隔符,默认用TAB
-s  #所有行合成一行显示

6、分析文本的工具

文本数据统计:wc
整理文本:sort
比较文件:diff和patch

6.1 收集文本统计数据 wc

wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数
可以对文件或STDIN中的数据统计
常用选项

-l 只计数行数
-w 只计数单词总数
-c 只计数字节总数
-m 只计数字符总数
-L 显示文件中最长行的长度

6.2 文本排序 sort

把整理过的文本显示在STDOUT,不改变原始文件
格式:

sort [options] file(s)

常用选项

-r 执行反方向(由上至下)整理
-R 随机排序
-n 执行按数字大小整理
-h 人类可读排序,如: 2K 1G
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique),合并重复项,即去重
-t @ 选项使用@做为字段界定符
-k ¥ 选项按照使用@字符分隔的¥列来整理能够使用多次

[root@centos7blog ~]# cat a.txt 
200
100
34556
23
[root@centos7blog ~]# cat b.txt 
123
43
200
3321

#合并显示并且去重
[root@centos7blog ~]# cat a.txt b.txt  | sort -nu
23
43
100
123
200
3321
34556


6.3 去重uniq

uniq命令从输入中删除前后相接的重复的行
格式:

uniq [OPTION]... [FILE]...

常见选项:

-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行

uniq常和sort 命令一起配合使用:

#并发连接最多的远程主机IP
[root@centos7blog ~]# ss -nt | tail -n+2 | tr -s ' ' : | cut -d: -f6 | sort | uniq -c | sort -nr
      1 10.0.0.254

#取文件的共同行
[root@centos7blog ~]# cat a.txt b.txt  | sort | uniq -d
200

#取文件的不同行
[root@centos7blog ~]# cat a.txt b.txt  | sort | uniq -u
100
123
23
3321
34556
43


6.4 比较文件

6.4.1 diff

diff 命令比较两个文件之间的区别

-u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件

[root@centos7blog ~]# diff a.txt b.txt 
0a1,2
> 123
> 43
2,4c4
< 100
< 34556
< 23
---
> 3321

[root@centos7blog ~]# diff -u a.txt b.txt 
--- a.txt   2021-12-27 23:16:12.023382348 +0800
+++ b.txt   2021-12-27 23:16:26.605382679 +0800
@@ -1,4 +1,4 @@
+123
+43
 200
-100
-34556
-23
+3321


6.4.2 patch

patch 复制在其它文件中进行的改变(要谨慎使用)

-b 选项来自动备份改变了的文件

[root@centos7blog ~]# diff -u a.txt b.txt > c.txt
[root@centos7blog ~]# cat c.txt 
--- a.txt   2021-12-27 23:16:12.023382348 +0800
+++ b.txt   2021-12-27 23:16:26.605382679 +0800
@@ -1,4 +1,4 @@
+123
+43
 200
-100
-34556
-23
+3321
[root@centos7blog ~]# patch -b c.txt a.txt 
patch: **** Only garbage was found in the patch input.


6.4.3 vimdiff

相当于 vim -d

[root@centos7blog ~]# vimdiff a.txt b.txt 
2 files to edit

  ------------------------------------------------|  123                                            
  ------------------------------------------------|  43                                             
  200                                             |  200
  100                                             |  3321                                           
  34556                                           |  -----------------------------------------------
  23                                              |  -----------------------------------------------


6.4.4 cmp

[root@centos7blog ~]# ll /usr/bin/dir /usr/bin/ls
-rwxr-xr-x. 1 root root 117608 Aug 20  2019 /usr/bin/dir
-rwxr-xr-x. 1 root root 117608 Aug 20  2019 /usr/bin/ls
[root@centos7blog ~]# diff /usr/bin/dir /usr/bin/ls
Binary files /usr/bin/dir and /usr/bin/ls differ
[root@centos7blog ~]# cmp /bin/dir /bin/ls
/bin/dir /bin/ls differ: byte 645, line 1


6.5练习

1、找出ifconfig “网卡名” 命令结果中本机的IPv4地址
[root@centos7blog ~]# ifconfig | head -2 | tail -1 | tr -s ' ' | cut -d' ' -f3
10.0.0.40

2、查出分区空间使用率的最大百分比值
[root@centos7blog ~]# df | tail -n +2 | tr -s ' ' | cut -d' ' -f5 | cut -d'%' -f1 | sort -nru | head -1
14


3、查出用户UID最大值的用户名、UID及shell类型
[root@centos7blog ~]# sort -t: -n -k3 -r /etc/passwd | head -1 |cut -d':' -f1,3,7
nfsnobody:65534:/sbin/nologin


4、查出/tmp的权限,以数字方式显示
[root@centos7blog ~]# stat /tmp | grep -oE '^A.*\([0-9]{4}' | cut -d '(' -f 2
1777

5、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序
[root@centos7blog ~]# ss -nt | tail -n+2 | tr -s ' ' | cut -d' ' -f 5 | cut -d: -f1 | sort -nr | uniq -c