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 16:15
下一篇 2016-08-08 16:15

相关推荐

  • 用户权限以及组权限作业

    1、在/data/testdir里创建的新文件自动属于g1组,组g2的成员如:alice能对这些新文件有读写权限,组g3的成员如:tom只能对新文件有读权限,其它用户(不属于g1,g2,g3)不能访问这个文件夹。 [root@localhost testdir]# mkdir -p /data/testdir [roo…

    Linux干货 2016-08-08
  • N25-第17周博客作业

    1、结合图形描述LVS的工作原理;     LVS (Linux Virtual Server)是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结…

    Linux干货 2017-05-21
  • Linux系统认知

    前言 在认识Linux系统之前先介绍下计算机的组成构造及其功能: 1,简单来说计算机可以划分为软件系统和硬件系统: (1)软件系统自不必说就是各种不同的程序,协助用户更好地使用电脑。 (2)硬件系统指的是主机、显示器、鼠键等硬件设备。 2,按冯诺依曼体系可将计算机按逻辑构成分为: (1)CPU(运算器、控制器)。运算器是数据处理装置,用来完成对数据的算术运算…

    Linux干货 2016-09-20
  • M22 用户、组学习总结

    Linux系统的登录方式是通过账号和密码。每一个登录账号都有一个主组可能有附加组。Linux内的文件和目录都有所有者和属组,只有相应权限的账户可以对其进行操作,下面我对用户权限相关内容进行了总结。   1、  用户ID,每个用户具有相应的ID号码,主要分为两类:系统ID和用户ID,在Centos6中系统ID为1-499,用户ID >…

    2017-02-22
  • 在软raid10上使用LVM,并且进行磁盘配额,最后还原。

    实验环境 1)centos 7.3 2)lvm格式化的文件系统为ext4 3)磁盘为单一磁盘的不同分区 4)使用软件:mdadm,lvm2 tools,quota 软raid10的创建 一,两个raid1的创建 1)对磁盘进行分区,使用工具fdidk,每个大小为1GB,类型改为fd。我的分区情况:/dev/sda{6,7,8,9}将会拿来做为raid的磁盘。…

    Linux干货 2017-03-16
  • 搭建yum仓库的FTP服务器

    搭建centos7ftp服务

    2017-12-02