常用文本处理工具及grep和正则表达式

一、文件查看命令

(1)普通查看工具:cat,tac,rev

 1、cat命令常用选项

   -n:显示行号

   -E:显示行结束符$

   -A:显示所有控制符

 2、tac:从最后一行开始倒序显示

 3、rev:将每一行的内容反转显示

 

(2)分页查看内容:more,less

 less功能比more多

 less是man帮助使用的分页器,用法与man相同

(3)显示文本前或后行内容:head,tail

 1.head与tail通用选项

 -c#:获取指定#字节内容

 -n #或-#:获取指定行数

 2.tail-f:跟踪显示文件新追加内容

二、文本处理工具

(1)按列抽取文本工具:cut

 -c:按字符切割

 -d:按分隔符切割

 -f:指明显示区域

 如,-f1、-f 1,3,5、-f 2-4、-f 1,5-9

 查看passwd文件,显示UID及shell类型

[root@centos7 tmp]# head -5 /etc/passwd |cut -d: -f3,7
0:/bin/bash
1:/sbin/nologin
2:/sbin/nologin
3:/sbin/nologin
4:/sbin/nologin

(2)分析文本的工具:wc,sort,uniq

 1. wc:统计行数,单词数,字符数,字节数

 -l:只统计行数

 -w:只统计单词数

 -m:只统计字符数

 -c:只统计字节数

 如下,分别显示行数,单词数,字符数

[root@centos7 tmp]# wc /etc/passwd
  48   93   2513 /etc/passwd

(3)文本排序工具:sort

 把排序后的文本输出到STDOUT,不改变原文件

 常用选项:

 -n:按数字大小排序

 -h:按人类易读单位排序

 -f:忽略(fold)字符串中的大小写

 -u:删除选项中重复的行

 -t:按指定分隔符

 -k #:按分隔符隔开的第#列进行排序,可重复使用

(4)重复行处理工具:uniq

 常用选项:

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

 -d:仅显示重复的行

 -u:仅显示不重复的行

 常和sort结合使用

 sort|uniq -c

 例子,统计所用用户shell类型使用个数

[root@centos7 ~]# cut -d: -f7 /etc/passwd|uniq -c         #没有sort排序得到错误结果  
      1 /bin/bash
      4 /sbin/nologin
      1 /bin/sync
      1 /sbin/shutdown
      1 /sbin/halt
     35 /sbin/nologin
      4 /bin/bash
      1 /sbin/nologin
[root@centos7 ~]# cut -d: -f7 /etc/passwd|sort|uniq -c   #sort结合uniq使用得到正确结果
      5 /bin/bash
      1 /bin/sync
      1 /sbin/halt
     40 /sbin/nologin
      1 /sbin/shutdown

(5)其他工具:paste,diff,patch

 1.paste:将连个文件同行合并

 2.diff:比较两个文件的区别

 3.patch:复制在其他文件中的改变

diff -u file.old file.new >patch.dd       #将比较信息输出到文件中
patch file.old patch.dd                   #通过补丁对文件更新

三、grep

 grep: Global search REgular expression and Print out the line.

 作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行;

 egrep等价于grep -E,支持扩展正则表达式

 fgrep等价于grep -F 不支持正则表达式,但速度快

 (1)grep [OPTIONS] PATTERN [FILE…]

 常用选项:

 -n:显示匹配的行号

 -c: 统计匹配的行数

 -v: 显示不能够被pattern匹配到的行

 -o: 仅显示匹配到的字符串

 -i: 忽略字符大小写

 -w:整行匹配整个单词

 -e:实现多个选项间的逻辑or关系

 grep –e ‘cat ’  -e ‘dog’  file

 -q: 静默模式,不输出任何信息

 -A #:after, 后#行

 -B #: before, 前#行

 -C #:context, 前后各#行

 -E:使用ERE

四、正则表达式

 REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,

 而表示控制或通配的功能。

 正则表达式分为两类:

 1.基本正则表达式:BRE

 2.扩展正则表达式:ERE

 元字符分类:字符匹配、匹配次数、位置锚定、分组

(1)字符匹配

 –构成模式的基本元素 

 . : 匹配任意单个字符

 []: 匹配指定范围内的任意单个字符

    [0-9],[a-zA-Z],[a-z0-9]…

 [^]:匹配指定范围外的任意单个字符

    [^0-9]非数字

 [:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]

(2)匹配次数

 匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

 *:匹配前面的字符任意次,包括0次;贪婪模式:尽可能长的匹配

 .*:任意长度的任意字符

 \?:匹配其前面的字符0或1次     

 \+:匹配其前面的字符至少1次       

 \{m\}:匹配前面的字符m次      

 \{m,n\}:匹配前面的字符至少m次,至多n次

 \{,n\}:匹配前面的字符至多n次

 \{m,\}:匹配前面的字符至少m次

(3)位置锚定

 位置锚定:定位出现的位置;更加精确描述字符的位置

 –这部分用法比较灵活,容易忘记锚定,造成错误匹配

 ^:行首锚定,用于模式的最左侧

 $:行尾锚定,用于模式的最右侧

   ^PATTERN$: 用于模式匹配整行

   ^$: 空行

   ^[[:space:]]*$ :空白行

 \< 或 \b:词首锚定,用于单词模式

 \> 或 \b:词尾锚定;用于单词模式

 \<PATTERN\>:匹配整个单词

(4)分组

 分组:\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+

 分组括号中的模式匹配到的内容会被正则表达式引擎记w录于内部的变量中,这些变量的命名方式为: \1,\2,\3,  …

 \1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;

 实例: \(string1\+\(string2\)*\)

 \1: string1\+\(string2\)*

 \2: string2

 后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)

 例子:添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用  户名同shell名的行

[root@centos7 movie]# egrep "^(.*\>).*\1$" /etc/passwd  
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
nologin:x:1005:1005::/home/nologin:/sbin/nologin

 ^(.*\>)——某个开头的单词

 \1$———-以(.*\>)这个单词结尾

 这样就找到符合题意的行

 扩展正则表达式的元字符

(1)字符匹配

 保持不变

(2)匹配次数

 \+ –> +

 \? –> ?

 \{\} –> {}

(3) 位置锚定

 保持不变

(4) 分组

 \(\) –>()

 后向引用:\1,\2,\3…

(5) 或者表示 

 cat|dog :cat或dog

 (C|c)at:Cat或cat

 

 *****牛刀小试****** 

 

 1、显示当前系统root、fly或halt用户的UID和默认shell

 2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

 3、使用egrep取出/etc/rc.d/init.d/functions中其基名

 4、使用egrep取出上面路径的目录名

 答案:

 1.egrep "^(root|fly|halt)\>" /etc/passwd|cut -d: -f3,7

 2.egrep "^[a-zA-Z_]+\(\).*" /etc/rc.d/init.d/functions

 3.egrep -o "[^/]+/?$"

 4.egrep -o ".*\<"

原创文章,作者:cutemsyu,如若转载,请注明出处:http://www.178linux.com/31757