Linux入门之常见文本处理工具
文本内容查看命令
cat tac rev more less head tail
普通文本查看 cat tac rev
cat 命令
cat [option] /path/to/file
-E 显示行结束标示符$
-n 显示行号
-b 对非空白行显示行号
-A 显示所有控制符
-s 压缩连续空白行为一行
-v 显示回车符
-T 显示tab符
[root@mzf ~]# cat -A cut.txt abcABC$ defDEF$
解析:查看文本中包含的特殊符号,在linux中$表示为行结束符
tac 命令 将文本逆向显示
tac [option] /path/to/file
-r [reg] :匹配正则表达式,其中reg匹配是针对文件名,而非文本内容
[root@mzf ~]# tac cut.txt
defDEF
abcABC
解析:这里的文本显示就是倒叙排序并显示文本,如最后一行显示为第一行
rev 命令 逐行将文本字符逆向排序后显示
rev /path/to/file
[root@mzf ~]# echo -e "abcdefg\n123456" > rev.txt [root@mzf ~]# cat rev.txt abcdefg 123456 [root@mzf ~]# rev rev.txt gfedcba 654321
解析:这里会逐行对字符进行逆向排序,只是调换索引位置,并没有任何排序算法
分页显示文本 more less
more 分页查看文件
more [option] /path/to/file
-d 显示翻页及退出提示
less 逐页查看文本或者结束STDIN标准输入进行分页查看
less /path/to/file
搜索关键字符查找
/string : 按 n键向下查找, N键向上查找
快捷键:
k 下一行 j 上一行
Ctrl+b 上一屏 Ctrl+f 下一屏
注意:在查看中可以使用! [command] 及!后面跟需要执行的命令,可以不退出less而执行显示命令
解析:这里使用less查看一个文件中内容中,然后使用!ls -l /var/log/messages查看指定文件的属性信息,但是使用less查看文本中使用!后跟的命令支持度有限,比如date +%F就无法执行成功
按前后行显示文本
显示前几行
head [option] File 默认显示前10行
-c # :全文中最开始的#个字符
-n # :前#行
-# :指定前#行
[root@mzf ~]# head -c 10 rev.txt #查找全文中前10个字符 abcdefg 12[root@mzf ~]#head -n 1 /etc/passwd #按行查找找前1行 root:x:0:0:root:/root:/bin/bash
显示当后几行
tail [option] File 默认显示后10行
-c # :全文中最后#个字符
-n # :后#行
-# : 后#行
-f : 跟踪文件变化 (一般用来跟踪日志)
[root@mzf ~]# cat -n /etc/passwd | tail -n 1 #查询最后一行重定向数据 60 wang:x:20012:20014::/home/wang:/bin/bash [root@mzf ~]# tail -c 10 /etc/passwd #全文查找最后10个字符 /bin/bash
文本格式处理
cut paste wc sort uniq
按列切割文本 cut命令
cut [option] /path/to/file
-d # :指定分割符
-f 按指定列显示
-f# 第几列
-f#,# 显示指定几列
-f#-# 显示从第几列到第几列
注意:可以混合显示,例如 cut -d: -f3,5,6-9
-c # 按字符分割,第几个字符,格式类似-f
-# 表示第1到#个字符 #- 表示第#到最后一个字符
–output-delimiter=" STRING" 指定输出分隔符,一般配合 -c 选项使用
[root@mzf ~]# cut -d':' -f1,3 /etc/passwd | tail -n 2 mage:20011 wang:20012
解析:按:符号把文本切成多列,取第1列和第3列
[root@mzf ~]# cat cut.txt abcABC defDEF [root@mzf ~]# cut -c -3,4- --output-delimiter='*' cut.txt abc*ABC def*DEF
解析:截取没一行第1到3个字符和第4到最后一个字符,然后中间用*隔开
注意:这里-c需要指定两个范围参数,否则用输出分隔符无效
合并两个文件同行号内容为一行 paste
paste [option] /path/to/file
-d :指定分割符,默认不指定使用tab符
-s :所有行显示为一行
例如: paste file1 fiel2
[root@mzf ~]# paste -d '*' /etc/passwd /etc/shadow | head -n 1 root:x:0:0:root:/root:/bin/bash*root:$6$vTjvO/Ex$TnsqEvhX7Zeava1t4D.9fSJ1Yt.Nb1iAvUa97nK1Ch/WksYn74mhlFYQKPfMvNGpMpqgwuolXLUaLHukspcH0/:17014:0:99999:7:::
解析:这里把每一行逐行链接,可以用用来对于文件来解析2个格式类型的文本文件的内容分析,比如这里可以同时分析root用户的用户属性和密码属性
文本统计命令 wc
wc [option] [file]
-l 统计行数
-w 统计单词数
-m 统计字符数
-c 统计字节数
不指定选项默认显示格式为:
[root@mzf ~]# wc cut.txt 2 2 14 cut.txt 行数 单词数 字符数 文件名
注意:因为文本文件的编码不同,字符数的计算可能也会有所不同
按条件过滤和排序 sort uniq
sort [options] /path/to/file…
-r 执行反方向(由上至下)整理
-n 执行按数字大小整理
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique)删除输出中的重复行
-t # 选项使用#做为字段界定符
-k [n] 选项按照使用#字符分隔的n列来整理能够使用多次
注意:如果数据中有按指定分割符排出的未到达列数的行,将被过滤为空白行
例如:
uniq 合并重复行
-c 显示重复次数
-d 只显示重复的行
-u 只显示不重复的行
注意:对于不能连续出现的重复行uniq不做处理,而此时可以配合sort将重复行排为连续显示,再使用uniq来确定最终的重复行数
例如:
[root@mzf ~]# cat test #查看test文本,发现以下三行文本 10.10.10. 10.10.10.10 10.10.10 [root@mzf ~]# sort -t'.' -k4 -nu test #使用.符号作为分隔符以第4列排序,然后使用数字排序过滤重复 10.10.10. 10.10.10.10
解析:这里test文本中只有2行同时存在3个.符号,2行中以.分割的第4列分别为空格、数字,而最后一条只有2个.符号,表示第4列为无,那么加上了-u选项(uniq),就意味着通过.符号划分出来的列将于空白行归位一类,压缩成行空白行而不显示数据,只有满足列数分割才会被匹配出来,-u是对与-k指定的列进行重复压缩,如果此列数据相同,那么其他列不同也会被过滤掉,这时可以指定多个-k选项来多列优先级,比如127.0.0.1和127.0.0.2如果指定-t'.' -k3 那么进入sort排序后只会存排在最前名在一个ip
例如:stort file1 | uniq -c
[root@mzf ~]# cat hello.txt #查看hello.txt文件 aaaaaaaaaaaa bbbbbbbbbbbb dddddddddddd dddddddddddd cccccccccccc dddddddddddd cccccccccccc dddddddddddd aaaaaaaaaaaa [root@mzf ~]# uniq -c hello.txt #发现非连续的重复行无法压缩为一行 1 aaaaaaaaaaaa 1 1 bbbbbbbbbbbb 1 2 dddddddddddd 1 cccccccccccc 1 dddddddddddd 1 cccccccccccc 1 dddddddddddd 1 aaaaaaaaaaaa [root@mzf ~]# sort hello.txt | uniq -c #这时想使用sort排序把字符相近的行排为连续行,再显示重复行 2 2 aaaaaaaaaaaa 1 bbbbbbbbbbbb 2 cccccccccccc 4 dddddddddddd
文件更新和文件补丁 diff path
diff 用来比较两个文件或目录区别
diff FILE1 FILE2
[root@mzf ~]# cat file1 #查看file1文件 This is a old line This is a old line service network start [root@mzf ~]# cat file2 #查看file2文件 This is a old line This is update newline This is a old line service network stop [root@mzf ~]# diff file1 file2 #逐行分析file1和file2的不同行 2c2 #第2行的不同比较 < --- > This is update newline 4c4 #第4行的不同比较 < service network start --- > service network stop 解析:发现file1和file2
的第二行有区别,file1中第二行是空行,而file2中第二行中
多了一行文字,第4行中两行数据不完全一样,也会被列出来
创建补丁文件 diff -u
[root@mzf ~]# diff -u file1 file2 --- file1 2016-08-06 09:34:00.210087098 +0800 +++ file2 2016-08-06 09:34:20.152088276 +0800 @@ -1,4 +1,4 @@ This is a old line - +This is update newline This is a old line -service network start +service network stop
说明:现在输出的信息就是详细的文件数据变化条目,比如数据的修改时间,-1,4表示file1文件的第1和4行,而+1,4表示file2文件的第1行和第4行,下面不同的行会连续显示,这样可以明确区分文件的不同信息,当然这个信息具有特殊格式,还可以用来更新文件
patch命令:复制在其它文件中进行的改变,一般配合diff使用
创建文件补丁并更新文件
将刚才的补丁格式数据保存至文件 [root@mzf ~]# diff -u file1 file2 > file2.patch #通过重定向将补丁格式数据写入文件 将文件内容更新为补丁中的指定内容 [root@mzf ~]# patch -b file1 file2.patch #使用patch命令-b来更新file1不同步的数据 patching file file1 [root@mzf ~]# cat file1 #再次查看file1文件,发现和file2数据同步 This is a old line This is update newline This is a old line service network stop [root@mzf ~]# patch -b file2 file2.patch #将file2文件的数据改变为未改变之前的file1数据 patching file file2 Reversed (or previously applied) patch detected! Assume -R? [n] y #这里提示是否重置 [root@mzf ~]# cat file2 #再次读取file2文件,发现真的还原回来了 This is a old line This is a old line service network start
注意:这里是patch需要配合读取diff -u创建的指定格式的补丁文件来根据格式判断改变指定行数据,如果对file2文件使用补丁那么file2也会变成原来的file1文件数据,这里就发现了补丁文件的强大之处
练习:
1、找出ifconfig命令结果中本机的所有IPv4地址
[root@mzf ~]# ifconfig | tr -cs '[0-9].' '\n' | sort -t '.' -k4 -n | tail -n 3 127.0.0.1 10.1.252.156 10.1.255.255 [root@mzf ~]# ifconfig | tr -cs '[0-9].' '\n' | sort -t'.' -k4 -nu 127.0.0.1 10.1.252.156 10.1.255.255 2、查出分区空间使用率的最大百分比值 [root@mzf ~]# df -lh | tr -s ' ' | tr ' ' ':' | cut -d: -f5 | tr -d '%' | sort -nr 100 31 19 1 1 Use 3、查出用户UID最大值的用户名、UID及shell类型 [root@mzf ~]# cat /etc/passwd | sort -t':' -k3 -n | tail -n 1 | cut -d: -f1,3,7 nfsnobody:65534:/sbin/nologin 4、查出/tmp的权限,以数字方式显示 [root@mzf ~]# stat /tmp | cut -d: -f2 | cut -d'/' -f1 | tr -cs '[0-9]\n' ' ' | tr -s '\n' ' ' | cut -d' ' -f4 1777 [root@mzf ~]# stat /tmp | cut -d':' -f2 | cut -d' ' -f2 | tr -cs '([0-9]' ':' | cut -d':' -f5 | tr -d '(' 1777 5、5、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序 [root@mzf ~]# netstat -nt | tr -s ' ' | cut -d' ' -f5 | tr -d '[:alpha:])' | cut -d: -f1 | sort -t'.' -k4 -nu | uniq -c 1 #这里的空白行不算 1 10.1.250.34:1836
原创文章,作者:ailisa5520,如若转载,请注明出处:http://www.178linux.com/30119