vlambda博客
学习文章列表

linux运维升级打怪之Linux基础(五)

1.5 linux基础(五)文本处理工具

1.5.1 文件查看cat,tac,rev,more,less,head,tail

1.5.1.1 文件查看命令:cat,tac,rev

  • cat [OPTION]... [FILE]...

    • -E: 显示行结束符$

    • -n: 对显示出的每一行进行编号

    • -A:显示所有控制符

 [root@CentOS7 ~]# cat >>f1 <<EOF
 > df
 > df
 > EOF  
 > EOF  
 >    ##为什么没有退出来,EOF后面不能加空格
 [root@CentOS7 ~]# cat -A f1
 dfl$
 dsfj$
 [root@CentOS7 ~]# cat -n f1
  1 dfl
  2 dsfj
 
 [root@CentOS7 ~]# cat -E f1
 dfl$
 dsfj$
  EOF$
 dfl$
 dsfj$
  EOF$
 dfj$
  • -b:非空行编号

 [root@CentOS7 ~]# cat -b f1
  1 dfl
 
 
 
  2 dsfj
  3 EOF
  4 dfl
  5 dsfj
  6 EOF
  7 dfj
  8 fdksfl
  9 dfj
 10 fdksfl
 11 dfj
 12 fdksfl
  • -s:压缩连续的空行成一行

 [root@CentOS7 ~]# cat f1
 dfl
 
 
 
 
 dsfj
  EOF
 dfl
 dsfj
  EOF
 [root@CentOS7 ~]# cat -s f1
 dfl
 
 dsfj
  EOF
 dfl
 dsfj
  EOF
  • tac:逆序

 [root@CentOS7 ~]# tac f1
 fdksfl
 dfj
 fdksfl
 dfj
 fdksfl
 dfj
  EOF
 dsfj
 dfl
  EOF
 dsfj
  • rev:逆序(文件中的每一行都倒着显示)

 [root@CentOS7 ~]# rev f1
 lfd
 jfsd
 FOE
 lfd
 jfsd
 FOE
 jfd
 lfskdf

1.5.1.2 more

  • 分页查看文件

more [OPTIONS...] FILE...

  • -d: 显示翻页及退出提示

1.5.1.3 less

一页一页地查看文件或STDIN输出

查看时有用的命令包括:

/文本 搜索 文本

n/N 跳到下一个 或 上一个匹配

less 命令是man命令使用的分页器

1.5.1.4 head

head [OPTION]... [FILE]...

  • -c #: 指定获取前#字节

 [root@CentOS7 data]# head -c4 /etc/passwd
 root[root@CentOS7 data]# head -c8 /etc/passwd
 root:x:0[root@CentOS7 data]#
  • -n #: 指定获取前#行

  • -#:指定行数

 [root@CentOS7 data]# head -n2 /etc/passwd
 root:x:0:0:root:/root:/bin/bash
 bin:x:1:1:bin:/bin:/sbin/nologin

1.5.1.5 tail

tail [OPTION]... [FILE]...

  • -c #: 指定获取后#字节

  • -n #: 指定获取后#行相当于-#

  • -f: 跟踪显示文件fd新追加的内容,常用日志监控相当于 --follow=descriptor

  • -F: 跟踪文件名,相当于—follow=name --retry

tailf 类似tail –f,当文件不增长时并不访问文件

1.5.2 按列抽取文本cut

cut [OPTION]... [FILE]...

显示文件或STDIN数据的指定列

  • -d DELIMITER: 指明分隔符,默认tab

  • -f FILEDS:

  • #: 第#个字段

  • #,#[,#]:离散的多个字段,例如1,3,6

  • #-#:连续的多个字段, 例如1-6,混合使用:1-3,7

  • -c 按字符切割

  • --output-delimiter=STRING指定输出分隔符

显示文件或STDIN数据的指定列

 [root@CentOS7 data]# cat /etc/passwd |cut -d: -f1
 root
 bin
 daemon
 adm
 lp
 sync
 [root@CentOS7 data]# cut -d: -f1 /etc/passwd ##取出用户名
 [root@CentOS7 data]# cat /etc/passwd | cut -d: -f7
 /bin/bash
 /sbin/nologin
 
 [root@CentOS7 data]#cut -c2-5 /usr/share/dict/words
 ##取出第二到第五个字节

1.5.3 paste

合并两个文件同行号的列到一行(横向合并)

paste [OPTION]... [FILE]...

  • -d 分隔符:指定分隔符,默认用TAB

  • -s : 所有行合成一行显示

 [root@CentOS7 scripts]# cat f1
 aaa
 bb
 cc
 [root@CentOS7 scripts]# cat f2
 xxx
 yy
 [root@CentOS7 scripts]# paste f1 f2
 aaaxxx
 bbyy
 cc
 [root@CentOS7 scripts]# cat f1 f2
 aaa
 bb
 cc
 xxx
 yy
 [root@CentOS7 scripts]# cat f1 f2 >f4
 [root@CentOS7 scripts]# cat f4
 aaa
 bb
 cc
 xxx
 yy
 [root@CentOS7 scripts]# paste -s f1 f2
 aaa bb cc
 xxxyy
 [root@CentOS7 scripts]# paste -d ":" f1 f2
 aaa:xxx
 bb:yy
 cc:

1.5.4 收集文本统计数据wc

  • 计数单词总数、行总数、字节总数和字符总数

  • 可以对文件或STDIN中的数据运行

  • wc story.txt

    39     237    1901 story.txt

    行数   字数 字节数  文件名

  • 常用选项

    • -l 只计数行数

    • -w 只计数单词总数

    • -c 只计数字符总数

    • -L 显示文件中最长行的长度

 [root@CentOS7 data]# cat /etc/passwd |wc -l
 64
 [root@CentOS7 data]# cat /etc/passwd |wc -L
 99
 [root@CentOS7 data]# cat /etc/passwd |wc -c
 3171
 [root@CentOS7 data]# cat /etc/passwd |wc -w
 109

   

1.5.5 文本排序sort

sort [options] file(s)

默认排序会把相同的行放在一块

常用选项

  • -r 执行反方向(由上至下)整理

  • -R  随机排序

 [root@CentOS7 scripts]# seq 72 |sort -R |head -n1
 35 ##随机排序,取出随机数,抽奖
  • -n 执行按数字大小整理

  • -f 选项忽略(fold)字符串中的字符大小写

  • -u 选项(独特,unique)删除输出中的重复行

  • -t :选项使用:作为字段界定符

  • -k # 选项按照使用c字符分隔的#列来整理能够使用多次 #(为数字)

练习:统计一篇英文文章中,单词出现频率最高的前3个单词

 [root@CentOS7 data]# cat f1|tr " " "\n"|tr -d [:punct:]|sort|uniq -c|sort -n|tail -n3
 9 and
 9 of
 15 the

1.5.6 uniq 默认会将重复行排序到一起

uniq命令:从输入中删除前后相接的重复的行

uniq [OPTION]... [FILE]...  

  • -c: 显示每行重复出现的次数

  • -d: 仅显示重复过的行

  • -u: 仅显示不曾重复的行

注:连续且完全相同方为重复-

常和sort 命令一起配合使用:   

sort  userlist.txt  |  uniq  -c

实验:对/var/log/httpd/access_log 日志文件访问ip进行排序,取出访问量最高的前十个ip

 cat /var/log/httpd/access_log  | cut -d" " -f1|sort |uniq -c |sort -nr|head -n10

1.5.7 比较文件diff 命令

比较两个文件之间的区别

 [root@CentOS7 data]# diff foo.conf foo2.conf
 5c5
 <   use_widgets = no  
 ---  
 > use_widgets = yes ##注明第5行有区别(改变)

1.5.8 复制对文件改变patch

diff 命令的输出被保存在一种叫做“补丁”的文件中

使用 -u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件

patch 复制在其它文件中进行的改变(要谨慎使用) 适用

-b 选项来自动备份改变了的文件

 $ diff -u foo.conf foo2.conf > foo.patch
 
 ##将文件foo.conf和foo2.conf比较差异,将生成的补丁放到foo.patch++
 
 $ patch foo.conf foo.patch
 
 ##将foo.conf打上补丁就变成了foo2.conf文件中的内容,不过foo.conf文件内容就被覆盖了
 
 $ patch -b foo.conf foo.patch  
 ##将foo.conf先备份,后打补丁,找回foo2.conf

练习:

 [root@CentOS7 scripts]# ifconfig ens33|head -n2 |tail -n1|tr -s ' '|cut -d' ' -f3
 192.168.110.131

2、查出分区空间使用率的最大百分比值

 [root@CentOS7 scripts]# df |grep "/dev/sd" |tr -s ' ' '%'|cut -d% -f5|sort -n |tail -n1
 16

3、查出用户UID最大值的用户名、UID及shell类型

 [root@CentOS7 scripts]# cat /etc/passwd |sort -t: -k3 -nr|head -n1|cut -d: -f1,3,7
 nfsnobody:65534:/sbin/nologin

4、查出/tmp的权限,以数字方式显示

 [root@CentOS7 scripts]# stat /tmp|cut -d'/' -f1|head -n4|tail -n1|cut -d'(' -f2
 1777
 [root@CentOS7 scripts]# stat /tmp |egrep -o "\([0-9]{3,4}"

5、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序

 [root@CentOS7 scripts]# netstat -nt |tr -s ' ' :|cut -d: -f6|tr -dc '[0-9].\n'|sort|uniq -c |sort -nr
 3 192.168.110.1
 2
 1 192.168.110.128
 [root@CentOS7 scripts]# netstat -nt |grep "tcp"|tr -s ' ' ':'|cut -d: -f6|sort |uniq -c |sort -nr
 2 192.168.110.1
 1 192.168.110.128