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

(0)
ailisa5520ailisa5520
上一篇 2016-08-08
下一篇 2016-08-08

相关推荐

  • 26期全程班-第六周博客作业

    请详细总结vim编辑器的使用并完成以下练习题 1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; # cp /etc/rc.d/rc.sysinit /tmp # vim /tmp/rc.sysinit :%s@^\([[:space:]]\+\)@#\1@g 2…

    Linux干货 2017-03-07
  • CentOS 7上的性能监控工具

    Linux中基于命令行的性能监控工具:dstat、top、netstat、vmstat、htop、ss、glances 1、dstat – 多类型资源统计工具(需配置epel源)   该命令整合了vmstat,iostat和ifstat三种命令。同时增加了新的特性和功能可以让你能及时看到各种的资源使用情况,从而能够使你对比和整…

    Linux干货 2016-09-07
  • ​从实验来了解grub

    实验一为grub设置密码 先看一看grub是怎么样的 grub有两个版本 grub: GRand Unified Bootloader grub 0.x: grub legacy grub 1.x: grub2  Note:grub 1.x是完全重写的只不过是保留grub 0.x的工作机制。 2.利用grub自带命令生成密码grub-md5-cry…

    Linux干货 2016-06-09
  • 马哥教育网络班20期+第三周博客作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一用户登录多次,则只显示一次即可。 [root@llww3317 ~]# who    #显示当前用户登录信息 root     tty1    &nbsp…

    Linux干货 2016-06-26
  • 到处都是Unix的胎记

    一说起Unix编程,不必多说,最著名的系统调用就是fork,pipe,exec,kill或是socket了(fork(2),execve(2), pipe(2), socketpair(2), select(2), kill(2), sigaction(2))这些系统调用都像是Unix编程的胎记或签名一样,表…

    Linux干货 2015-04-03
  • 基于lamp实现wordpress(php-rpm)与phpMyAdmin(pph-rpm+https支持)

    前言    踩了好多坑终于把想象中的样子搭建出来了。真的是,只有遇到问题了,然后扎耳挠腮把问题解决了,才是真的学到了。此次环境我们采用lamp架构,并且通过fastcgi让httpd和php进行通信。当然所有的一切都是在同一台主机上实现。本次安装的应用是phpMyAdmin-4.4.14.1和wordpress-4.3.1

    Linux干货 2016-12-26