文件常见处理工具
1.文件内容查看命令
1.1 查看文本文件内容
cat:查看文件内容
1 格式: 2 cat [OPTION]... [FILE]... 3 4 常见选项 5 -E:显示行结束符$ 6 -A:显示所有控制符 7 -n:对显示出的每一行进行编号 8 -b:非空行编号 9 -s:压缩连接的空行成一行
nl:显示行号,相当于cat -b
[root@CentOS8 ~]# seq 5 > 1.txt [root@CentOS8 ~]# cat -n 1.txt 1 2 3 4 1 5 2 6 3 7 4 8 5 [root@CentOS8 ~]# cat -b 1.txt 1 1 2 2 3 3 4 4 5 5 [root@CentOS8 ~]# nl 1.txt 1 1 2 2 3 3 4 4 5 5
tac:逆向显示文本内容
[root@CentOS8 ~]# cat 1.txt 1 2 3 4 5 [root@CentOS8 ~]# tac 1.txt 5 4 3 2 1 [root@CentOS8 ~]# seq 10 | tac 10 9 8 7 6 5 4 3 2 1
rev:将同一行的内容逆向显示
[root@CentOS8 ~]# cat 1.txt 1 2 3 4 5 a b c [root@CentOS8 ~]# tac 1.txt a b c 1 2 3 4 5 [root@CentOS8 ~]# rev 1.txt 5 4 3 2 1 c b a [root@CentOS8 ~]# echo {1..10} | rev 01 9 8 7 6 5 4 3 2 1
1.2 查看非文本文件内容
hexdump
[root@CentOS8 ~]# hexdump -C -n 512 /dev/sda 00000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.c..............| [root@CentOS8 ~]# hexdump -C abc 00000000 61 62 63 0a |abc.| 00000004 [root@CentOS8 ~]# 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
od 即:dump files in octal and other formats
[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.< 0000033
xxd
[root@CentOS8 ~]# echo {a..z} |tr -d ‘ ‘ |xxd 00000000: 6162 6364 6566 6768 696a 6b6c 6d6e 6f70 abcdefghijklmnop 00000010: 7172 7374 7576 7778 797a 0a qrstuvwxyz.
1.3 分页查看内容
more:可以实现分页查看文件,可以配合管道实现输出信息的分页
格式
more [OPTIONS...] FILE...
选项:
-d:显示翻页及退出提示
less:可以实现分页查看文件或STDIN输出,less命令时man命令使用的分页器
查看时有用的命令包括: /文本 向下搜索 文本 /?文本 向上搜索 n/N 跳到下一个 或 上一个匹配
1.4 显示文本前或后行内容
head:可以显示文本或标准输入的前面行
格式: head [OPTION]... [FILE]... 选项: -c # 指定获取前#字节 -n # 指定获取前#行 -# 同上
例:
[root@CentOS8 ~]# 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@CentOS8 ~]# 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@CentOS8 ~]# seq 10 > 1.txt [root@CentOS8 ~]# head -n -3 1.txt 1 2 3 4 5 6 7 [root@CentOS8 ~]# echo abcdef | head -c 3 abc[root@CentOS8 ~]#
tail:tail和head相反,查看文件或标准输入的倒数行
格式: tail [OPTION]... [FILE]... -c # 指定获取后#字节 -n # 指定获取后#行 -# 同上 -f 跟踪显示文件fd新追加的内容,常用日志监控,相当于--follow=descriptor,当文件删除再新建同名文件,无法继续跟踪文件 -F 跟踪文件名,相当于--follow=name --retry,当文件删除再新建同名文件,可以继续跟踪文件
例:
[root@CentOS8 ~]# cat 1.txt 1 2 3 4 5 6 7 8 9 10 [root@CentOS8 ~]# tail -n3 1.txt 8 9 10 [root@CentOS8 ~]# tail -3 1.txt 8 9 10 [root@CentOS8 ~]# tail -n +3 1.txt 3 4 5 6 7 8 9 10 [root@CentOS8 ~]# seq 10 | head -6 | tail -1 6 [root@CentOS8 ~]# seq 10 | tail -n +6 | head -1 6
1.5 按列抽取文本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@CentOS8 ~]# cut -d: -f1,3-4,7 /etc/passwd [root@CentOS8 ~]# df | tr -s ‘ ‘ | cut -d ‘ ‘ -f 5 | tr -d %|tail -n +2 [root@centos8 ~]# df | tail -n +2|tr -s ‘ ‘ % |cut -d% -f5
1.6 合并多个文件paste
paste:合并多个文件同行号的列到一行
格式 paste [OPTION]... [FILE]... 常用选项: -d:分隔符:指定分隔符,默认为TAB -S:所有行合成一行显示
例:
[root@centos8 ~]#cat alpha.log a b c d e f g h [root@centos8 ~]#cat seq.log 1 2 3 4 5 [root@centos8 ~]#cat alpha.log seq.log a b c d e f g h 1 2 3 4 5 [root@centos8 ~]#paste alpha.log seq.log a 1 b 2 c 3 d 4 e 5 f g h [root@centos8 ~]#paste -d":" alpha.log seq.log a:1 b:2 c:3 d:4 e:5 f: g: h: [root@centos8 ~]#paste -s seq.log 1 2 3 4 5 [root@centos8 ~]#paste -s alpha.log a b c d e f g h [root@centos8 ~]#paste -s alpha.log seq.log a b c d e f g h 1 2 3 4 5 [root@centos8 ~]#cat title.txt ceo coo cto [root@centos8 ~]#cat emp.txt mage zhang wang xu [root@centos8 ~]#paste title.txt emp.txt ceo mage coo zhang cto wang xu [root@centos8 ~]#paste -s title.txt emp.txt ceo coo cto mage zhang wang xu [root@centos8 ~]#seq 100|paste -d + -s|bc 5050
1.7 分析文本工具
文本数据统计:wc
整理文本:sort
比较文件:diff和patch
收集文本统计数据wc
wc命令可用于统计文本的行总数、单词总数、字节总数和字符总数
可以对文件或STDIN中的数据统计
常用选项 -l 只统计行数 -w 只计数单词总数 -c 只计数字节总数 -m 只计数字符总数 -L 显示文件中最长行的长度
例:
wc story.txt 39 237 1901 story.txt 行数 单词数 字节数 [root@CentOS8 ~]# df | tail -n $(echo `df | wc -l`-1 | bc) devtmpfs 897700 0 897700 0% /dev tmpfs 916500 0 916500 0% /dev/shm tmpfs 916500 8916 907584 1% /run tmpfs 916500 0 916500 0% /sys/fs/cgroup /dev/sda2 104806400 3213588 101592812 4% / /dev/sda3 52403200 398400 52004800 1% /data /dev/sda1 1038336 189356 848980 19% /boot tmpfs 183300 0 183300 0% /run/user/0
文本排序sort
把整理过的文本显示在STDOUT,不改变原始文件
格式: sort [options] file(s) 常用选项 -r 执行反方向(由上至下)整理 -R 随机排序 -n 执行按数字大小整理 -f 选项忽略(fold)字符串中的字符大小写 -u 选项(独特,unique),合并重复项,即去重 -t c 选项使用c作为字段定界符 -k # 选项按照使用c字符分割的#列来整理能够使用多次
例:
[root@CentOS8 ~]# cut -d: -f 1,3 /etc/passwd | sort -t: -k2 -nr | head -n3 nobody:65534 wang:1000 systemd-coredump:999 #查看分区利用率最高值 [root@centos8 ~]#df| tr -s ‘ ‘ ‘%‘|cut -d% -f5|sort -nr|head -1 100 面试题:有两个文件,a.txt与b.txt ,合并两个文件,并输出时确保每个数字也唯一 [root@CentOS8 ~]# cat a.txt b.txt | sort -nr | uniq -u 23452345 1341345 1235345 54361 12345 12341 2345 100 [root@CentOS8 ~]# cat a.txt 200 100 23452345 1234 12341 1235345 [root@CentOS8 ~]# cat b.txt 1234 200 2345 54361 12345 1341345
去重uniq
uniq命令从输入中删除前后相接的重复的行
格式 uniq [OPTION]... [FILE]... 常见选项 -c:显示每行重复出现的次数 -d:仅显示重复过的行 -u:仅显示不曾重复的行
unqi常和sort命令一起配合使用:
例:sort userlist.txt | uniq -c
例:统计日志访问量最多的请求
[root@centos8 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@centos8 data]#lastb -f btmp-34 | tr -s ‘ ‘ |cut -d ‘ ‘ -f3|sort |uniq -c |sort -nr | head -3 86294 58.218.92.37 43148 58.218.92.26 18036 112.85.42.201
例:并发链接最多的远程主机IP
[root@centos8 ~]#ss -nt|tail -n+2 |tr -s ‘ ‘ : |cut -d: -f6|sort|uniq -c|sort -nr |head -n2 7 10.0.0.1 2 10.0.0.7
例:取两个文件的相同和不同的行
1 [root@centos8 data]#cat test1.txt 2 a 3 b 4 1 5 c 6 [root@centos8 data]#cat test2.txt 7 b 8 e 9 f 10 c 11 1 12 2 13 #取文件的共同行 14 [root@centos8 data]#cat test1.txt test2.txt | sort |uniq -d 15 1 16 b 17 c 18 #取文件的不同行 19 [root@centos8 data]#cat test1.txt test2.txt | sort |uniq -u 20 2 21 a 22 e 23 f
比较文件
diff命令比较两个文件之间的区别,diff命令的输出可被保存在一种叫做“补丁”的文件中
常用选项:-u选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件
例:
[root@centos8 ~]#cat f1.txt mage zhang wang xu [root@centos8 ~]#cat f2.txt magedu zhang sir wang xu shi [root@centos8 ~]#diff f1.txt f2.txt 1,2c1,2 < mage < zhang --- > magedu > zhang sir 4a5 > shi [root@centos8 ~]#diff -u f1.txt f2.txt --- f1.txt 2019-12-13 21:31:30.892775671 +0800 +++ f2.txt 2019-12-13 22:00:14.373677728 +0800 @@ -1,4 +1,5 @@ -mage -zhang +magedu +zhang sir wang xu +shi [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 [root@centos8 ~]#cat f1.txt magedu zhang sir wang xu shi [root@centos8 ~]#cat f1.txt.orig mage zhang wang xu
patch 复制在其他文件中进行的改变(谨慎使用)
常用选项
-b 选项来自动备份改变了的文件
例:
diff -u foo.conf foo2.conf > foo.patch
patch -b foo.conf foo.patch