16.第五章 文本常见处理工具(二)

2.文本常见处理工具

2.1 文件内容查看命令

2.1.1 查看文本文件内容

2.1.1.1 cat

cat 可以查看文本内容

格式:

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

常见选项

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

范例:

[root@rocky8 ~]# cat win.txt 
a
b
c[root@rocky8 ~]# cat -A win.txt #-A 查看不可见字符 
a^M$
b^M$
c[root@rocky8 ~]#

[root@rocky8 ~]# cat >a.txt <<EOF
> a
> 
> 
> b
> 
> 
> c
> EOF
[root@rocky8 ~]# cat a.txt 
a


b


c
[root@rocky8 ~]# cat -n a.txt  #-n 显示行号
     1	a
     2	
     3	
     4	b
     5	
     6	
     7	c
[root@rocky8 ~]# cat -b a.txt  #-b  空行不显示行号,只有非空行显示行号
     1	a


     2	b


     3	c
[root@rocky8 ~]# cat -A a.txt 
a$
$
$
b$
$
$
c$
[root@rocky8 ~]# cat -s a.txt  #-s 压缩连续空行为一行
a

b

c
[root@rocky8 ~]# cat -As a.txt 
a$
$
b$
$
c$

范例:

[root@rocky8 data]# vim fa.txt
a b
c 
d	b	c
[root@rocky8 ~]# cat -A fa.txt 
a b$
c $
d^Ib^Ic$
[root@rocky8 ~]# cat fa.txt 
a b
c 
d	b	c
[root@rocky8 ~]# cat fb.txt 
a
b
c
[root@rocky8 ~]# cat -A fb.txt 
a^M$
b^M$
c^M$
[root@rocky8 ~]# he
head     help     hexdump  
[root@rocky8 ~]# hexdump -C fb.txt 
00000000  61 0d 0a 62 0d 0a 63 0d  0a                       |a..b..c..|
00000009
[root@rocky8 ~]# file fb.txt 
fb.txt: ASCII text, with CRLF line terminators

2.1.1.2 nl

显示行号,相当于cat -b

[root@rocky8 ~]# nl a.txt 
     1	a
       
       
     2	b
       
       
     3	c
[root@rocky8 ~]# cat -b a.txt 
     1	a


     2	b


     3	c

2.1.1.3 tac

逆向显示文本内容

[root@rocky8 data]# seq 10 
1
2
3
4
5
6
7
8
9
10
[root@rocky8 data]# seq 10 |tac #tac 把不同行文件倒过来显示
10
9
8
7
6
5
4
3
2
1

[root@rocky8 data]# tac
a
bb
ccc 按ctrl+d
ccc
bb
a

2.1.1.4 rev

将同一行的内容逆向显示

[root@rocky8 data]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@rocky8 data]# echo {a..z} | rev #rev把同一行文件倒过来写
z y x w v u t s r q p o n m l k j i h g f e d c b a

2.1.2 查看非文本文件内容

2.1.2.1 hexdump

范例:

[root@rocky8 data]# 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  7d 50 d7 43 00 00 80 04  |........}P.C....|
000001c0  01 04 83 fe c2 ff 00 08  00 00 00 00 20 00 00 fe  |............ ...|
000001d0  c2 ff 83 fe c2 ff 00 08  20 00 00 00 80 0c 00 fe  |........ .......|
000001e0  c2 ff 83 fe c2 ff 00 08  a0 0c 00 00 40 06 00 fe  |............@...|
000001f0  c2 ff 05 fe c2 ff 00 08  e0 12 00 f8 1f 06 55 aa  |..............U.|
00000200

[root@rocky8 data]# echo abc | hexdump -C
00000000  61 62 63 0a                                       |abc.|
00000004

[root@rocky8 data]# 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

2.1.2.2 od

od 即 dump files in octal and other formats 转储八进制和其他格式的文件

范例:

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

[root@rocky8 data]# 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@rocky8 data]# 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

2.1.2.3 xxd

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

2.2 分页查看文件内容

2.2.1 more

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

格式

more [OPTIONS...] FILE...

选项:

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

范例:

[root@rocky8 data]# ls -R /etc | more
/etc:
adjtime
aliases
alternatives
anacrontab
at.deny
audit
authselect
bash_completion.d
bashrc
bindresvport.blacklist
binfmt.d
chkconfig.d
cifs-utils
cron.d
cron.daily
cron.deny
cron.hourly
cron.monthly
crontab
cron.weekly
crypto-policies
crypttab
csh.cshrc
csh.login
dbus-1
--More-- #q 退出

[root@rocky8 data]# ls -R /etc | more -d
/etc:
adjtime
aliases
alternatives
anacrontab
at.deny
audit
authselect
bash_completion.d
bashrc
bindresvport.blacklist
binfmt.d
chkconfig.d
cifs-utils
cron.d
cron.daily
cron.deny
cron.hourly
cron.monthly
crontab
cron.weekly
crypto-policies
crypttab
csh.cshrc
csh.login
dbus-1
--More--[Press space to continue, 'q' to quit.]

2.2.2 less

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

查看时有用的命令包括:

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

范例:

[root@rocky8 data]# ls -R /etc |less
/etc:
adjtime
aliases
alternatives
anacrontab
at.deny
audit
authselect
bash_completion.d
bashrc
bindresvport.blacklist
binfmt.d
chkconfig.d
cifs-utils
cron.d
cron.daily
cron.deny
cron.hourly
cron.monthly
crontab
cron.weekly
crypto-policies
crypttab
csh.cshrc
csh.login
dbus-1
:

范例:

#less 配合管道对其它命令的执行结果 分页显示
[root@rocky8 data]# tree -d /etc |less
/etc
├── alternatives
├── audit
│   ├── plugins.d
│   └── rules.d
├── authselect
│   └── custom
├── bash_completion.d
├── binfmt.d
├── chkconfig.d
├── cifs-utils
├── cron.d
├── cron.daily
├── cron.hourly
├── cron.monthly
├── cron.weekly
├── crypto-policies
│   ├── back-ends
│   ├── local.d
│   ├── policies
│   │   └── modules
│   └── state
├── dbus-1
│   ├── session.d
│   └── system.d
├── default
: #q 退出

2.3 显示文本前或后行内容

2.3.1 head

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

格式:

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

选项:

-c # 指定获取前#字节
-n # 指定获取前#行
-# 同上

范例:

[root@rocky8 data]# seq 100 |head #head 默认显示文件前10行
1
2
3
4
5
6
7
8
9
10 
[root@rocky8 data]# seq 100 |head -n 3 #-n指定多少行
1
2
3
[root@rocky8 data]# echo {a..z} 
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@rocky8 data]# echo {a..z} | head -c 5 #-c取前几个字符
a b c[root@rocky8 data]#

[root@rocky8 data]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c10 #取出随机的前10个字符
1HL73ArcyO

[root@rocky8 data]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c10 | tee pass.txt | passwd --stdin raymond #给账户生成一个多位口令的随机密码
Changing password for user raymond.
passwd: all authentication tokens updated successfully.
[root@rocky8 data]# cat pass.txt 
KWENpwZmNs
[root@rocky8 data]# su - boss
Last login: Wed Oct  6 22:15:25 CST 2021 on pts/0
[boss@rocky8 ~]$ su - raymond
Password: 
Last login: Thu Oct  7 20:09:43 CST 2021 on pts/0
[raymond@rocky8 ~]$ exit
logout
[boss@rocky8 ~]$ exit
logout

范例:

[root@rocky8 ~]# 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

[root@rocky8 ~]# head -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

[root@rocky8 ~]# echo a我b | head -c4
a我

[root@centos8 ~]#cat /dev/urandom | tr -dc '[:alnum:]'| head -c10
G755MlZatW[root@centos8 ~]#cat /dev/urandom | tr -dc '[:alnum:]'| head -c10
ASsax6DeBz[root@centos8 ~]#cat /dev/urandom | tr -dc '[:alnum:]'| head -c10 | tee
pass.txt | passwd --stdin mage
Changing password for user mage.
passwd: all authentication tokens updated successfully.
[root@centos8 ~]#cat pass.txt
AGT952Essg[root@centos8 ~]#su - wang
[wang@centos8 ~]$su - mage
Password:

[root@rocky8 ~]# seq 10 |head -n 3 #取前3个
1
2
3
[root@rocky8 ~]# seq 10 |head -n -3 #不取最后3个
1
2
3
4
5
6
7

2.3.2 tail

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

格式:

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

选项:

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

范例:

[root@rocky8 ~]# seq 20 | tail
11
12
13
14
15
16
17
18
19
20
[root@rocky8 ~]# seq 20 | tail -n 3
18
19
20
[root@rocky8 ~]# seq 20 | tail -n +3  #+3  指的是从第三行往后
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@rocky8 ~]# seq 20 | tail -n -3 #-3 最后3个
18
19
20

范例:

[root@rocky8 ~]# tail -3 /var/log/messages 
Oct  7 20:13:37 rocky8 systemd[2857]: Reached target Default.
Oct  7 20:13:37 rocky8 systemd[2857]: Startup finished in 34ms.
Oct  7 20:13:37 rocky8 systemd[1]: Started User Manager for UID 0.

[root@rocky8 ~]# tail -f /var/log/messages  #tail -f跟踪日志信息
Oct  7 20:13:37 rocky8 systemd-logind[854]: New session 7 of user root.
Oct  7 20:13:37 rocky8 systemd[2857]: Reached target Timers.
Oct  7 20:13:37 rocky8 systemd[2857]: Reached target Paths.
Oct  7 20:13:37 rocky8 systemd[2857]: Starting D-Bus User Message Bus Socket.
Oct  7 20:13:37 rocky8 systemd[2857]: Listening on D-Bus User Message Bus Socket.
Oct  7 20:13:37 rocky8 systemd[2857]: Reached target Sockets.
Oct  7 20:13:37 rocky8 systemd[2857]: Reached target Basic System.
Oct  7 20:13:37 rocky8 systemd[2857]: Reached target Default.
Oct  7 20:13:37 rocky8 systemd[2857]: Startup finished in 34ms.
Oct  7 20:13:37 rocky8 systemd[1]: Started User Manager for UID 0.

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

[root@rocky8 ~]# ifconfig | head -2 | tail -1
-bash: ifconfig: command not found #最小化安装没有ifconfig命令,安装net-tools工具包
[root@rocky8 ~]# yum -y install net-tools
[root@rocky8 ~]# ifconfig | head -2 | tail -1
        inet 172.31.1.8  netmask 255.255.248.0  broadcast 172.31.7.255

#选择第6行
[root@rocky8 ~]# seq 20| head -n 6|tail -n1
6
[root@rocky8 ~]# seq 20| tail -n +6 |head -n1
6

16.第五章 文本常见处理工具(二)

2.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@rocky8 ~]# cd /data
[root@rocky8 data]# cp /etc/passwd .
[root@rocky8 data]# cut -d ":" -f 1,3-5 passwd #cut -d 指定分隔符  -f  指定取出第几列
root:0:0:root
bin:1:1:bin
daemon:2:2:daemon
adm:3:4:adm
lp:4:7:lp
sync:5:0:sync
shutdown:6:0:shutdown
halt:7:0:halt
mail:8:12:mail
operator:11:0:operator
games:12:100:games
ftp:14:50:FTP User
nobody:65534:65534:Kernel Overflow User
dbus:81:81:System message bus
systemd-coredump:999:997:systemd Core Dumper
systemd-resolve:193:193:systemd Resolver
tss:59:59:Account used for TPM access
polkitd:998:996:User for polkitd
unbound:997:994:Unbound DNS resolver
sssd:996:993:User for sssd
sshd:74:74:Privilege-separated SSH
postfix:89:89:
raymond:1000:1000:
boss:1001:1001:

[root@rocky8 data]# df
Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs          382688       0    382688   0% /dev
tmpfs             400580       0    400580   0% /dev/shm
tmpfs             400580    5692    394888   2% /run
tmpfs             400580       0    400580   0% /sys/fs/cgroup
/dev/sda2      104806400 2320396 102486004   3% /
/dev/sda3       52403200  398416  52004784   1% /data
/dev/sda1        1038336  191796    846540  19% /boot
tmpfs              80116       0     80116   0% /run/user/0
[root@rocky8 data]# df |cut -c 43-46 #-c  按字符取
 Use
   0
   0
   2
   0
   3
   1
  19
   0

[root@rocky8 data]# df |tr -s " "
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 382688 0 382688 0% /dev
tmpfs 400580 0 400580 0% /dev/shm
tmpfs 400580 5692 394888 2% /run
tmpfs 400580 0 400580 0% /sys/fs/cgroup
/dev/sda2 104806400 2320396 102486004 3% /
/dev/sda3 52403200 398416 52004784 1% /data
/dev/sda1 1038336 191796 846540 19% /boot
tmpfs 80116 0 80116 0% /run/user/0
[root@rocky8 data]# df |tr -s " "|cut -d " " -f5
Use%
0%
0%
2%
0%
3%
1%
19%
0%
[root@rocky8 data]# df |tr -s " "|cut -d " " -f5 |tr -d %
Use
0
0
2
0
3
1
19
0
[root@rocky8 data]# df |tr -s " " % |cut -d% -f5
Use
0
0
2
0
3
1
19
0
[root@rocky8 data]# df |tr -s " " % |cut -d% -f5 |tail -n +2
0
0
2
0
3
1
19
0

范例:

[root@rocky8 data]# ifconfig |head -n2 |tail -n1|cut -d" " -f10
172.31.1.8
[root@rocky8 data]# ifconfig |head -n2 |tail -n1|tr -s " " |cut -d " " -f3
172.31.1.8
[root@rocky8 data]# df | tr -s ' '|cut -d' ' -f5 |tr -dc "[0-9\n]"

0
0
2
0
3
1
19
0
[root@rocky8 data]# df | tr -s ' ' % |cut -d% -f5 |tr -d '[:alpha:]'

0
0
2
0
3
1
19
0
[root@rocky8 data]# df | cut -c44-46 |tr -d '[:alpha:]'

  0
  0
  2
  0
  3
  1
 19
  0
[root@rocky8 data]# cut -d: -f1,3,7 --output-delimiter="---" /etc/passwd
root---0---/bin/bash
bin---1---/sbin/nologin
daemon---2---/sbin/nologin
adm---3---/sbin/nologin
lp---4---/sbin/nologin
sync---5---/bin/sync
shutdown---6---/sbin/shutdown
halt---7---/sbin/halt
mail---8---/sbin/nologin
operator---11---/sbin/nologin
games---12---/sbin/nologin
ftp---14---/sbin/nologin
nobody---65534---/sbin/nologin
dbus---81---/sbin/nologin
systemd-coredump---999---/sbin/nologin
systemd-resolve---193---/sbin/nologin
tss---59---/sbin/nologin
polkitd---998---/sbin/nologin
unbound---997---/sbin/nologin
sssd---996---/sbin/nologin
sshd---74---/sbin/nologin
postfix---89---/sbin/nologin
raymond---1000---/bin/bash
boss---1001---/bin/bash

范例: 取分区利用率

#取分区利用率
[root@rocky8 data]# df|tr -s ' ' |cut -d' ' -f5 |tr -d %
Use
0
0
2
0
3
1
19
0

[root@rocky8 data]# df|tr -s ' ' '%'|cut -d% -f5
Use
0
0
2
0
3
1
19
0

[root@rocky8 data]# df |cut -c 44-46|tail -n +2
  0
  0
  2
  0
  3
  1
 19
  0

[root@rocky8 data]# df | tail -n +2|tr -s ' ' % |cut -d% -f5
0
0
2
0
3
1
19
0

[root@rocky8 data]# df | tail -n +2|tr -s ' ' |cut -d' ' -f5 |tr -d %
0
0
2
0
3
1
19
0

2.5 合并多个文件 paste

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

格式

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

常用选项:

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

范例:

[root@rocky8 data]# seq 100 >c.txt
[root@rocky8 data]# paste -s c.txt >f.txt
[root@rocky8 data]# cat f.txt
1	2	3	4	5	6	7	8	9	10	11	12	13	14	15	16	17	18    19	20	21	22	23	24	25	26	27	28	29	30	31	32	33	34	35	36    37	38	39	40	41	42	43	44	45	46	47	48	49	50	51	52	53	54    55	56	57	58	59	60	61	62	63	64	65	66	67	68	69	70	71	72    73	74	75	76	77	78	79	80	81	82	83	84	85	86	87	88	89	90    91	92	93	94	95	96	97	98	99	100
[root@rocky8 data]# cat -A f.txt
1^I2^I3^I4^I5^I6^I7^I8^I9^I10^I11^I12^I13^I14^I15^I16^I17^I18^I19^I20^I21^I22^I23^I24^I25^I26^I27^I28^I29^I30^I31^I32^I33^I34^I35^I36^I37^I38^I39^I40^I41^I42^I43^I44^I45^I46^I47^I48^I49^I50^I51^I52^I53^I54^I55^I56^I57^I58^I59^I60^I61^I62^I63^I64^I65^I66^I67^I68^I69^I70^I71^I72^I73^I74^I75^I76^I77^I78^I79^I80^I81^I82^I83^I84^I85^I86^I87^I88^I89^I90^I91^I92^I93^I94^I95^I96^I97^I98^I99^I100$
[root@rocky8 data]# cat f.txt | tr '\t' '\n'

范例:

[root@rocky8 data]# echo {a..h} | tr -s ' ' '\n' > alpha.log
[root@rocky8 data]# cat alpha.log
a
b
c
d
e
f
g
h
[root@rocky8 data]# seq 5 > seq.log
[root@rocky8 data]# cat seq.log
1
2
3
4
5

[root@rocky8 data]# cat alpha.log seq.log
a
b
c
d
e
f
g
h
1
2
3
4
5

[root@rocky8 data]# paste alpha.log seq.log
a	1
b	2
c	3
d	4
e	5
f	
g	
h	
[root@rocky8 data]# paste -d":" alpha.log seq.log
a:1
b:2
c:3
d:4
e:5
f:
g:
h:

[root@rocky8 data]# paste -s seq.log
1	2	3	4	5
[root@rocky8 data]# paste -s alpha.log
a	b	c	d	e	f	g	h
[root@rocky8 data]# paste -s alpha.log seq.log
a	b	c	d	e	f	g	h
1	2	3	4	5

[root@rocky8 data]# cat > title.txt <<EOF
> ceo
> cto
> coo
> EOF
[root@rocky8 data]# cat title.txt 
ceo
cto
coo

[root@rocky8 data]# cat > emp.txt <<EOF
> zhang
> wang
> li
> zhao
> EOF
[root@rocky8 data]# cat emp.txt 
zhang
wang
li
zhao
[root@rocky8 data]# paste title.txt emp.txt
ceo	zhang
cto	wang
coo	li
	zhao
[root@rocky8 data]# paste -s title.txt emp.txt
ceo	cto	coo
zhang	wang	li	zhao

[root@rocky8 data]# seq 100|paste -d + -s|bc
5050

2.6 分析文本的工具

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

2.6.1 收集文本统计数据 wc

wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数

可以对文件或STDIN中的数据统计

常用选项

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

范例:

[root@rocky8 data]# wc c.txt
100 100 292 c.txt
#行数 单词数 字节数
[root@rocky8 data]# ll c.txt
-rw-r--r-- 1 root root 292 Oct  7 20:34 c.txt
[root@rocky8 data]# wc -l c.txt #wc -l显示多少行
100 c.txt
[root@rocky8 data]# cat /etc/passwd |wc -l
24
[root@rocky8 data]# df |tr -s " " % |cut -d% -f5 |tail -n +2 
0
0
2
0
3
1
19
0
[root@rocky8 data]# df |tr -s " " % |cut -d% -f5 |tail -n +2 |wc -l 
8

[root@rocky8 data]# cat > title.txt <<EOF
> ceo zhang
> coo wang
> cto li
> EOF
[root@rocky8 data]# cat > title1.txt <<EOF
> ceo zhang
> coo wang
> cto 老李
> EOF
[root@rocky8 data]# ll title.txt title1.txt 
-rw-r--r-- 1 root root 30 Oct  7 20:51 title1.txt
-rw-r--r-- 1 root root 26 Oct  7 20:50 title.txt
[root@rocky8 data]# wc title.txt 
 3  6 26 title.txt
[root@rocky8 data]# wc title1.txt 
 3  6 30 title1.txt

[root@rocky8 data]# wc -l title.txt 
3 title.txt
[root@rocky8 data]# cat title.txt | wc -l
3

[root@rocky8 data]# df | tail -n $(echo `df | wc -l`-1|bc)
devtmpfs          382688       0    382688   0% /dev
tmpfs             400580       0    400580   0% /dev/shm
tmpfs             400580    5692    394888   2% /run
tmpfs             400580       0    400580   0% /sys/fs/cgroup
/dev/sda2      104806400 2320316 102486084   3% /
/dev/sda3       52403200  398444  52004756   1% /data
/dev/sda1        1038336  191796    846540  19% /boot
tmpfs              80116       0     80116   0% /run/user/0

2.6.2 文本排序 sort

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

格式:

sort [options] file(s)

常用选项

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

范例:

[root@rocky8 data]# sort /etc/passwd #sort 默认按照字符顺序排序
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
boss:x:1001:1001::/home/boss:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
raymond:x:1000:1000::/home/raymond:/bin/bash
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
sssd:x:996:993:User for sssd:/:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
unbound:x:997:994:Unbound DNS resolver:/etc/unbound:/sbin/nologin

[root@rocky8 data]# sort -t: -k3 /etc/passwd #-t 指定分隔符  -k 指定第几列 默认是按字符排列
root:x:0:0:root:/root:/bin/bash
raymond:x:1000:1000::/home/raymond:/bin/bash
boss:x:1001:1001::/home/boss:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/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
tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sssd:x:996:993:User for sssd:/:/sbin/nologin
unbound:x:997:994:Unbound DNS resolver:/etc/unbound:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin

[root@rocky8 data]# sort -t: -k3 -n /etc/passwd #-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
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
sssd:x:996:993:User for sssd:/:/sbin/nologin
unbound:x:997:994:Unbound DNS resolver:/etc/unbound:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
raymond:x:1000:1000::/home/raymond:/bin/bash
boss:x:1001:1001::/home/boss:/bin/bash
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin

[root@rocky8 data]# sort -t: -k3 -nr /etc/passwd #-r 倒序排列
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
boss:x:1001:1001::/home/boss:/bin/bash
raymond:x:1000:1000::/home/raymond:/bin/bash
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
unbound:x:997:994:Unbound DNS resolver:/etc/unbound:/sbin/nologin
sssd:x:996:993:User for sssd:/:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
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

[root@rocky8 data]# df
Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs          382688       0    382688   0% /dev
tmpfs             400580       0    400580   0% /dev/shm
tmpfs             400580    5692    394888   2% /run
tmpfs             400580       0    400580   0% /sys/fs/cgroup
/dev/sda2      104806400 2320316 102486084   3% /
/dev/sda3       52403200  398444  52004756   1% /data
/dev/sda1        1038336  191796    846540  19% /boot
tmpfs              80116       0     80116   0% /run/user/0
[root@rocky8 data]# df |tr -s ' ' '%' |cut -d% -f5
Use
0
0
2
0
3
1
19
0
[root@rocky8 data]# df |tr -s ' ' '%' |cut -d% -f5 |tail -n +2
0
0
2
0
3
1
19
0
[root@rocky8 data]# df |tr -s ' ' '%' |cut -d% -f5 |tail -n +2 |sort -nr
19
3
2
1
0
0
0
0
[root@rocky8 data]# df |tr -s ' ' '%' |cut -d% -f5 |tail -n +2 |sort -nr |head -1
19

[root@rocky8 data]# cat >aa.txt <<EOF
> a
> b
> a
> c
> a
> c
> b
> EOF
[root@rocky8 data]# sort aa.txt
a
a
a
b
b
c
c
[root@rocky8 data]# sort -u aa.txt #-u  去重
a
b
c

范例:

[root@rocky8 data]# cut -d: -f1,3 /etc/passwd|sort -t: -k2 -nr |head -n3
nobody:65534
boss:1001
raymond:1000

#统计日志访问量
[root@rocky8 data]# cut -d" " -f1 access_log |sort -u|wc -l
201

范例:统计分区利用率

[root@rocky8 data]# df
Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs          382688       0    382688   0% /dev
tmpfs             400580       0    400580   0% /dev/shm
tmpfs             400580    5692    394888   2% /run
tmpfs             400580       0    400580   0% /sys/fs/cgroup
/dev/sda2      104806400 2320316 102486084   3% /
/dev/sda3       52403200  407316  51995884   1% /data
/dev/sda1        1038336  191796    846540  19% /boot
tmpfs              80116       0     80116   0% /run/user/0

#查看分区利用率最高值
[root@rocky8 data]# df| tr -s ' ' '%'|cut -d% -f5|sort -nr|head -1
19

[root@rocky8 data]# df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort

0
0
0
0
1
19
2
3
[root@rocky8 data]# df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -n

0
0
0
0
1
2
3
19
[root@rocky8 data]# df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -n |tail -n1
19

[root@centos8 ~]#df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -nr
15
5
1
1
1
0
0
0

[root@rocky8 data]# df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -nr |head -1
19

面试题:有两个文件,a.txt与b.txt ,合并两个文件,并输出时确保每个数字也唯一

#a.txt中的每一个数字在本文件唯一
200
100
34556
23
...

#b.txt中的每一个数字在本文件唯一
123
43
200
3321
...

#就是将两个文件合并后重复的行去除,不保留
100
345563
123
43
3321
...

2.6.3 去重uniq

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

格式:

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

常见选项:

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

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

范例:

[root@rocky8 data]# cat > aa.txt <<EOF
> a
> b
> a
> a
> c
> c
> a
> c
> b
> b
> EOF
[root@rocky8 data]# cat aa.txt 
a
b
a
a
c
c
a
c
b
b
[root@rocky8 data]# uniq aa.txt  #uniq 去掉相邻的重复字符
a
b
a
c
a
c
b
[root@rocky8 data]# uniq -c aa.txt #-c  重复几次
      1 a
      1 b
      2 a
      2 c
      1 a
      1 c
      2 b

[root@rocky8 data]# cat aa.txt 
a
b
a
a
c
c
a
c
b
b
[root@rocky8 data]# sort aa.txt 
a
a
a
a
b
b
b
c
c
c
[root@rocky8 data]# sort aa.txt | uniq  -c #统计重复几次
      4 a
      3 b
      3 c
[root@rocky8 data]#  sort aa.txt |uniq -c|sort -nr
      4 a
      3 c
      3 b
[root@rocky8 data]#  sort aa.txt |uniq -c|sort -nr | head -1
      4 a

范例:

sort userlist.txt | uniq -c

范例:统计日志访问量最多的请求

[root@rocky8 data]# cut -d" " -f1 access_log |sort |uniq -c|sort -nr |head -3
   4870 172.20.116.228
   3429 172.20.116.208
   2834 172.20.0.222

[root@10-9-24-182 ~]# lastb |tr -s ' ' |cut -d ' ' -f3 |sort |uniq -c |sort -nr |head -3
  34096 113.141.66.163
  24460 222.186.10.188
  16449 119.118.20.161

范例:并发连接最多的远程主机IP

[root@rocky8 data]# ss -nt |tail -n +2 |tr -s ' ' : |cut -d: -f6 |sort |uniq -c |sort -nr |head -2
	7 10.0.0.1
	2 10.0.0.7

范例:取两个文件的相同和不同的行

[root@rocky8 data]# cat > test1.txt <<EOF
> a
> b
> 1
> c
> EOF
[root@rocky8 data]# cat test1.txt
a
b
1
c

[root@rocky8 data]# cat > test2.txt <<EOF
> b
> e
> f
> c
> 1
> 2
> EOF
[root@rocky8 data]# cat test2.txt 
b
e
f
c
1
2

#取文件的共同行
[root@rocky8 data]# cat test1.txt test2.txt | sort |uniq -d
1
b
c

#取文件的不同行
[root@rocky8 data]# cat test1.txt test2.txt | sort |uniq -u
2
a
e
f

2.6.4 比较文件

2.6.4.1 diff

diff 命令比较两个文件之间的区别,diff 命令的输出可被保存在一种叫做“补丁”的文件中

常用选项

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

范例:

[root@rocky8 data]# cat > f1.txt <<EOF
> zhang
> wang
> li
> zhao
> EOF
[root@rocky8 data]# cat f1.txt 
zhang
wang
li
zhao
[root@rocky8 data]# cat > f2.txt <<EOF
> zhangliang
> wangsir
> li
> zhao
> gao
> EOF
[root@rocky8 data]# cat f2.txt 
zhangliang
wangsir
li
zhao
gao

[root@rocky8 data]# diff f1.txt f2.txt 
1,2c1,2
< zhang
< wang
---
> zhangliang
> wangsir
4a5
> gao

[root@rocky8 data]# diff -u f1.txt f2.txt 
--- f1.txt	2021-10-07 21:30:15.134764613 +0800
+++ f2.txt	2021-10-07 21:31:20.962768219 +0800
@@ -1,4 +1,5 @@
-zhang
-wang
+zhangliang
+wangsir
 li
 zhao
+gao

[root@centos8 ~]#diff -u f1.txt f2.txt > f.patch
[root@rocky8 data]# diff -u f1.txt f2.txt > f.patch
[root@rocky8 data]# rm -f f2.txt
[root@rocky8 data]# patch -b f1.txt f.patch #这里恢复会把f2.txt 恢复成f1.txt,使用-b恢复前先把f1.txt备份成f1.txt.orig ,恢复的文件f1.txt就是原来f2.txt文件
patching file f1.txt
[root@rocky8 data]# cat f1.txt
zhangliang
wangsir
li
zhao
gao
[root@rocky8 data]# cat f1.txt.orig 
zhang
wang
li
zhao

2.6.4.2 patch

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

常用选项:

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

范例:

diff -u foo.conf foo2.conf > foo.patch
patch -b foo.conf foo.patch

2.7 练习

1、找出ifconfig “网卡名” 命令结果中本机的IPv4地址
2、查出分区空间使用率的最大百分比值
3、查出用户UID最大值的用户名、UID及shell类型
4、查出/tmp的权限,以数字方式显示
5、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序

上一篇:【微信小程序】车位在线销售平台(三)


下一篇:17.第五章 文本处理三剑客之 grep和正则表达式(三)