Linux入门之常见文本处理工具

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便查看调用命令.jpg

解析:这里使用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

解析:截取没一行第13个字符和第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文件的第14行,而+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