文本常见处理工具
1 文件内容查看命令
1.1 查看文本文件内容
1.1.1 cat
cat命令查看文本内容
格式
cat [OPTION]... [FILE]...
参数
cat -E 显示文本的每行结束符$
cat -A 显示文本所有特殊字符(tab键^I,windowns换行^M,每行结束符$)
cat -n 对显示出的每一行进行编号
cat -b 非空行编号
cat -s 压缩连续的空行成一行1.1.2 nl
nl命令相当于cat -b,对文本非空行编号显示
[root@centos7 /data ]# cat t1.txt
a
b
c
d
[root@centos7 /data ]# cat -b t1.txt
1 a
2 b
3 c
4 d
[root@centos7 /data ]# nl t1.txt
1 a
2 b
3 c
4 d1.1.3 tac
tac命令和cat命令输出内容相反,cat按照文本从开头到结尾输出信息,tac按照文本从结尾到开头输出信息
[root@centos7 /data ]# cat t1.txt
a
b
c
d
[root@centos7 /data ]# tac t1.txt
d
c
b
a1.1.4 rev
rev命令翻译为 reverse 反转,按照文本每行内容进行反转
[root@centos7 /data ]# cat t1.txt
a b c d
[root@centos7 /data ]# rev t1.txt
d c b a1.2 查看非文本文件内容
1.1 hexdump
hexdump是linux下的一个二进制文件查看工具,它可以将二进制文件转换为ASCII、八进制、十进制、十六进制格式进行查看
-n length 只格式化输入文件的前length个字节
-C 输出规范的十六进制和ASCII码
-b 单字节八进制显示
-c 单字节字符显示
-d 双字节十进制显示
-o 双字节八进制显示
-x 双字节十六进制显示范例
显示磁盘设备前512个字节
hexdump -C -n 512 /dev/sda
显示a-z的ASCII码
echo {a..z} | tr -d ' '|hexdump -C1.2 od
od命令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来。
-a 此参数的效果和同时指定”-ta”参数相同
-A 选择要以何种基数计算字码
-b 此参数的效果和同时指定”-toC”参数相同
-c 此参数的效果和同时指定”-tC”参数相同
-d 此参数的效果和同时指定”-tu2″参数相同
-f 此参数的效果和同时指定”-tfF”参数相同
-h 此参数的效果和同时指定”-tx2″参数相同
-i 此参数的效果和同时指定”-td2″参数相同
-j<字符数目> 略过设置的字符数目
-l 此参数的效果和同时指定”-td4″参数相同
-N<字符数目> 到设置的字符数目为止
-o 此参数的效果和同时指定”-to2″参数相同
-s<字符串字符数> 只显示符合指定的字符数目的字符串
-t<输出格式> 设置输出格式
-v 输出时不省略重复的数据
-w<每列字符数> 设置每列的最大字符数范例
[root@centos8 ~]#echo {a..z} | tr -d ' '|od -t x
0000000 64636261 68676665 6c6b6a69 706f6e6d
0000020 74737271 78777675 000a7a79
0000033
[root@centos8 ~]#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@centos8 ~]#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.<
00000331.3 xxd
xxd的作用就是将一个文件以十六进制的形式显示出来。它还可以将十六进制转储转换回其原始二进制形式
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 命令针对于文本内容过多,使用more一点一点的读取
more -n 按空格每次读取文件n行内容
more +n 从第n行开始读取内容
more -c 清除屏幕的内容,显示文件的内容
more -n -c 每次读取n行内容前清空屏幕
more -s 把内容中连续的空行代换为一行空行
读取内容操作:
空格键 显示文本的下一屏内容
回车键 向下n行,需要定义 more -n,默认为1行
h键 显示帮助屏
b键 显示上一屏内容
q键 退出more命令
= 输出当前的行号
:f 输出文件名和当前的行号
V 调用vi编辑器
! 调用Shell,并执行命令2.2 less命令
less 命令 和more 命令功能都是分屏读取内容,less功能比more强大支持一些vim的操作
less /etc/ssh/sshd_config 显示一屏
less -N /etc/ssh/sshd_config 大写N 显示行号
读取内容操作:
b 向后翻一页
d 向后翻半页
h 显示帮助界面
Q 退出less 命令
u 向前滚动半页
y 向前滚动一行
空格键 滚动一页
回车键 滚动一行
/ 搜索信息3 显示文本前或后行内容
3.1 head 命令
# head 命令 —— 显示文件本从头内容
head /etc/passwd 默认显示前10行的内容
head -n 5 /etc/passwd 显示前5行内容信息
head -v 显示文件名的头信息
head -c 指定显示前几个字节范例
生成随机密码口令
cat /dev/urandom | tr -dc '[:alnum:]'|head -c10
生成随机口令作为用户密码
cat /dev/urandom | tr -dc '[:alnum:]'|head -c10 | tee passwd.txt | passwd --stdin test3.2 tail命令
tail -c # 指定获取后#字节
tail -n # 指定获取后#行
tai -# 同上
tail -f 跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新建同名文件,将无法继续跟踪文件
tail -F 跟踪文件名,相当于--follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文件3.3 head 和 tail 总结
4 按列抽取文本cut
cut 命令可以提取文本文件或STDIN数据的指定列
cut -d DELIMITER 指明分隔符,默认tab
cut -f FILEDS 取第几列(字段)
# 第#个字段,例如:3
#,#[,#] 不连续的多个字段,例如:1,3,6
#-#:连续的多个字段, 例如:1-6
混合使用:1-3,7
cut -c 按字符切割
cut --output-delimiter=STRING指定输出分隔符范例
1./etc/passwd文件取出用户名,UID,GID,解释器
[root@centos7 ~ ]# cut -d: -f1,3-4,7 /etc/passwd
root:0:0:/bin/bash
bin:1:1:/sbin/nologin
daemon:2:2:/sbin/nologin
2./etc/passwd文件取出用户名,UID,GID,解释器,指定以"---"作为输出分割符
[root@centos7 ~ ]# cut -d: -f1,3-4,7 /etc/passwd --output-delimiter="---"
root---0---0---/bin/bash
bin---1---1---/sbin/nologin
daemon---2---2---/sbin/nologin
3.取出系统磁盘使用率df
df |tr -s " "|cut -d" " -f5|tr -dc "[0-9\n%]"
df | tr -s ' ' % |cut -d% -f5 |tr -d '[:alpha:]'5 合并多个文件
paste命令合并多个文件同一行内容合并成为一行
paste -d 指定合并分割符,默认是tab
paste -s paste默认是纵向合并, -s 横向合并范例
[root@centos7 /data ]# echo {1..5}|tr " " "\n">t1.txt
[root@centos7 /data ]# echo {a..h}|tr " " "\n">t2.txt
[root@centos7 /data ]# cat t1.txt
1
2
3
4
5
[root@centos7 /data ]# cat t2.txt
a
b
c
d
e
f
g
[root@centos7 /data ]# paste t2.txt t1.txt
a 1
b 2
c 3
d 4
e 5
f
g
h
[root@centos7 /data ]# paste -d"+" t2.txt t1.txt
a+1
b+2
c+3
d+4
e+5
f+
g+
h+
[root@centos7 /data ]# paste -sd"+" t2.txt t1.txt
a+b+c+d+e+f+g+h
1+2+3+4+56 分析文本的工具
文本数据统计:wc
整理文本:sort
比较文件:diff和patch
6.1 收集文本统计数据 wc
wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数 可以对文件或STDIN中的数据统计
格式
wc [OPTION]... [FILE]...
#常用选项
-l|--lines #只计数行数
-w|--words #只计数单词总数
-c|--bytes #只计数字节总数
-m|--chars #只计数字符总数
-L|--max-line-length #显示文件中最长行的长度范例
wc story.txt
39 237 1901 story.txt
行数 单词数 字节数
[root@centos8 ~]#wc title.txt
3 6 30 title.txt
#管道重定向
[root@centos8 ~]#cat title.txt | wc -l
3
#不显示第一行
[root@centos8 ~]#df | tail -n $(echo `df | wc -l`-1|bc)
devtmpfs 910220 0 910220 0% /dev
tmpfs 924728 0 924728 0% /dev/shm
tmpfs 924728 9224 915504 1% /run
tmpfs 924728 0 924728 0% /sys/fs/cgroup
/dev/sda2 104806400 4836160 99970240 5% /
/dev/sda3 52403200 398580 52004620 1% /data
/dev/sda1 999320 131764 798744 15% /boot
tmpfs 184944 4 184940 1% /run/user/0
[root@centos7 /data ]# wc -c t3.txt
7 t3.txt
[root@centos7 /data ]# wc -m t3.txt
3 t3.txt6.2 文本排序sort
把整理过的文本显示在STDOUT,不改变原始文件
格式
sort [OPTION]... [FILE]...
#常用选项
-b|--ignore-leading-blanks #忽略文件中的空白
-f|--ignore-case #忽略大小写
-h|--human-numeric-sort #人类可读排序
-M|--month-sort #以月份排序
-n|--numeric-sort #以数字大小排序
-R|--random-sort #随机排序
-r|-reverse #倒序
-t|--field-separator=SEP #指定列分割d
-k|--key=KEYDEF #指定排序列
-u|--unique #去重
-z|--zero-terminated #以 NUL 字符而非换行符作为行尾分隔符范例
sort排序默认按照第一个字符字母表依次比较, 同样内容情况: 小写字母在上,大写字母在下
[root@centos7 /data ]# cat t4.txt
aa
bb
AB
cc
ab
[root@centos7 /data ]# sort t4.txt
aa
ab
AB
bb
cc
合并重复内容
[root@centos7 /data ]# sort -fu t4.txt
aa
AB
bb
cc
#统计/etc/passwd文件,按照用户UID从大到小排序,取出用户名和UID
[root@centos7 /data ]# sort -t":" -k3 -rn /etc/passwd|cut -d: -f1,3| head -3
nfsnobody:65534
mysql:1012
varnish:1011
[root@centos8 data]# cut -d: -f1,3 /etc/passwd|sort -t: -k2 -nr |head -n3
nobody:65534
xiaoming:1002
xiaoh:1001
#统计日志访问量
[root@centos8 data]# cut -d" " -f1 /var/log/nginx/access_log |sort -u|wc -l
201范例:统计分区利用率
[root@centos8 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 391676 0 391676 0% /dev
tmpfs 408092 0 408092 0% /dev/shm
tmpfs 408092 5816 402276 2% /run
tmpfs 408092 0 408092 0% /sys/fs/cgroup
/dev/sda2 104806400 2259416 102546984 3% /
/dev/sda3 52403200 398608 52004592 1% /data
/dev/sda1 999320 130848 799660 15% /boot
tmpfs 81616 0 81616 0% /run/user/0
/dev/sr0 7377866 7377866 0 100% /misc/cd
#查看分区利用率最高值
[root@centos8 ~]# df| tr -s ' ' '%'|cut -d% -f5|sort -nr|head -1
100
[:alnum:]:字母和数字
[:alpha:]:字母
[:digit:]:数字
[:lower:]:小写字母
[:upper:]:大写字母
[:space:]:空白字符
[:print:]:可打印字符
[:punct:]:标点符号
[:graph:]:图形字符
[:cntrl:]:控制(非打印)字符
[:xdigit:]:十六进制字符
[root@centos8 ~]# df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort
0
0
0
1
1
1
15
5
[root@centos8 ~]# df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -n
0
0
0
1
1
1
5
15
[root@centos8 ~]# df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -n |tail -n1
15
[root@centos8 ~]# df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -nr
15
5
1
1
1
0
0
0
[root@centos8 ~]# df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -nr|head -n1
15面试题:有两个文件,a.txt与b.txt ,合并两个文件,并输出时确保每个数字也唯一
[root@rocky86 ~]# cat a.txt
1111
222
33
4444
5
666
77
8
9999
100000
[root@rocky86 ~]# cat b.txt
8
1111
33
222
100000
77
159
666
137
189
[root@rocky86 ~]# cat a.txt b.txt | sort -n | uniq
5
8
33
77
137
159
189
222
666
1111
4444
9999
1000006.3 去重uniq
uniq命令从输入中删除前后相接的重复的行,常和 sort 配合使用
格式:
uniq [OPTION]... [INPUT [OUTPUT]]
#常见选项
-c|--count #显示每行出现次数
-d|--repeated #仅显示有重复行
-D #显示所有重复行具体内容
-u|--unique #仅显示不重复的行
-z|--zero-terminated #以 NUL 字符而非换行符作为行尾分隔符范例:
[root@rocky86 ~]# sort -n a.txt b.txt | uniq -c
范例:统计日志访问量最多的前三名的请求
[root@rocky86 ~]# lastb | head -n $(echo `lastb | wc -l`-2 | bc) | tr -s ' ' | cut -d " " -f3 | sort | uniq -c | sort -nr | head -3
17 10.0.0.1范例:取两个文件的相同和不同的行
[root@centos7 /data ]# cat t5.txt
aa
bb
aa
cc
bb
cc
cc
[root@centos7 /data ]# uniq t5.txt
aa
bb
aa
cc
bb
cc
[root@centos7 /data ]# cat t5.txt
aa
bb
aa
cc
bb
cc
cc
[root@centos7 /data ]# cat t6.txt
aa
bb
aa
dd
[root@centos7 /data ]# cat t5.txt t6.txt | sort|uniq -d
aa
bb
cc
[root@centos7 /data ]# cat t5.txt t6.txt | sort|uniq -u
dd6.4 比较文件
6.4.1 diff
diff 命令比较两个文件之间的区别
格式:
diff [OPTION]... FILES
#常用选项
-u #选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件范例:
[root@centos8 ~]# cat f1.txt
1
2
3
[root@centos8 ~]# cat f2.txt
3
7
2
5
[root@centos8 ~]#diff -u f1.txt f2.txt
--- f1 2022-04-26 16:26:29.648932024 +0800
+++ f2 2022-04-26 16:26:37.274438606 +0800
@@ -1,3 +1,4 @@ #比较结果,- 表示第一个文件, + 表示第二个文件,第一个文件有3行,第二个文件有4行
-1 #第一个文件此行去掉
-2 #第一个文件此行去掉
3
+7 #第一个文件加上此行内容
+2 #第一个文件加上此行内容
+5 #第一个文件加上此行内容
#将对比结果保存至文件
[root@centos8 ~]#diff -u f1.txt f2.txt > f.patch
[root@centos8 ~]#rm -f f2.txt
#用来还原
[root@centos8 ~]#patch -b f1.txt f.patch
patching file f1.txt
#原还出来的是 f2
[root@centos8 ~]#cat f1.txt
3
7
2
5
[root@centos8 ~]#cat f1.txt.orig
1
2
36.4.2 patch
patch 复制在其它文件中进行的改变(要谨慎使用)
格式:
patch [OPTION]... [ORIGFILE [PATCHFILE]]
#常用选项
-b|--backup #备份范例:
[root@centos7 ~]# yum -y install patch
[root@centos8 ~]#patch -b f1.txt f.patch
patching file f1.txt
#用f1.txt和 f.patch 生成一个名为f1.txt的文件,但内容是原来f2.txt文件中的内容,#-b 选项则备份了现有的 f1.txt6.4.3 vimdiff
相当于 vim -d
[root@centos8 ~]#which vimdiff
/usr/bin/vimdiff
[root@centos8 ~]#ll /usr/bin/vimdiff
lrwxrwxrwx. 1 root root 3 Nov 12 2019 /usr/bin/vimdiff -> vim
[root@centos8 ~]# vimdiff f1.txt f2.txt6.4.4 cmp
范例:查看二进制文件的不同
[root@centos8 data]#ll /usr/bin/dir /usr/bin/ls
-rwxr-xr-x. 1 root root 166448 May 12 2019 /usr/bin/dir
-rwxr-xr-x. 1 root root 166448 May 12 2019 /usr/bin/ls
[root@centos8 data]#ll /usr/bin/dir /usr/bin/ls -i
201839444 -rwxr-xr-x. 1 root root 166448 May 12 2019 /usr/bin/dir
201839465 -rwxr-xr-x. 1 root root 166448 May 12 2019 /usr/bin/ls
[root@centos8 data]#diff /usr/bin/dir /usr/bin/ls
Binary files /usr/bin/dir and /usr/bin/ls differ
[root@centos8 ~]#cmp /bin/dir /bin/ls
/bin/dir /bin/ls differ: byte 737, line 2
#跳过前735个字节,观察后面30个字节
[root@centos8 ~]#hexdump -s 735 -Cn 30 /bin/ls
000002df 00 05 6d da 3f 1b 77 91 91 63 a7 de 55 63 a2 b9 |..m.?.w..c..Uc..|
000002ef d9 d2 45 55 4c 00 00 00 00 03 00 00 00 7d |..EUL........}|
000002fd
[root@centos8 ~]#hexdump -s 735 -Cn 30 /bin/dir
000002df 00 f1 21 4e f2 19 7e ef 38 0d 9b 3e d7 54 08 39 |..!N..~.8..>.T.9|
000002ef e4 74 4d 69 25 00 00 00 00 03 00 00 00 7d |.tMi%........}|
000002fd6.5 文本内容转换 tr
tr的英文全称是“ transform ”,即转换的意思。该命令的作用是一种可将字符进行替换、压缩、删除,他可以将一组字符转换成另一组字符。tr他只能从标准输入中读取数据,因此,tr要么将输入文件重定向到标准输入,要么从管道读入数据。
tr命令格式:tr [参数] [字符1] [字符2]
字符1:是指被替换的字符
字符2:是指字符1中字符要替换为的字符
常见参数
tr 匹配字符集
范例:
[root@centos7 ~ ]# tr '[a-z]' '[A-Z]'
adbc <-- 输入
ADBC <-- 输出
[root@centos7 ~ ]# tr '[a-z]' '[A-Z]' < /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/NOLOGINtr命令替换字符按照字符1和字符2中对应位置字符进行替换
情况一: 被替换字符 = 替换为字符
[root@centos7 ~ ]# echo 123456 | tr 1234 abcd
abcd56情况二:(海王)多对一替换,被替换字符 > 替换为字符,则会被替换多余字符替换字符2的最后一个字符。
[root@centos7 ~ ]# echo 123456 | tr 1234 abc
abcc56
说明:1替换为a 2替换为b 3替换为c, 此时替换信息字符已经没有,4没有替换的字符,就和前面字符共用一个字符,4 替换 ctr -t可以解决多对一替换情况
[root@centos7 ~ ]# echo 123456 | tr -t 1234 abc
abc456情况三:(单身)被替换字符 < 替换为字符,则一一对应进行替换,字符2多余字符不管。
[root@centos7 ~ ]# echo 123456 | tr 123 abcde
abc456
说明:1替换为a 2替换为b 3替换为c, 此时再有替换的字符没有需要替换的字符了,相当于男人找女朋友,d 和 e 只能单身情况四:(谁没年轻过)被替换字符中出现重复字符,则为最后匹配的字符为准
[root@centos7 ~ ]# echo 123456 | tr 1213 abcd
cbd456
说明:1替换为a 2替换为b 1替换为c 3替换为d, 最后替换结果为 1替换为c 2替换为b 3替换为d范例
[root@centos7 ~ ]# free -h|grep 'Mem'|tr -s " "|cut -d" " -f2
974M
磁盘使用情况
df |tr -s " "|cut -d" " -f5|tr -dc "[0-9\n%]"
df | tr -s ' ' % |cut -d% -f5 |tr -d '[:alpha:]'
生成随机密码口令
cat /dev/urandom | tr -dc '[:alnum:]'|head -c10练习
找出ifconfig “网卡名” 命令结果中本机的IPv4地址
查出分区空间使用率的最大百分比值
查出用户UID最大值的用户名、UID及shell类型
查出/tmp的权限,以数字方式显示
统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序