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
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的连接数,并按从大到小排序