1、linux文本处理工具:

    grep:文本过滤工具,可以基于字符串和PATTERN进行过滤

    sed:流编辑器

    awk:linux上的实现为gawk,文本报告生成器,格式化文本。

以上三个工具都会用到正则表达式。


2、正则表达式介绍:

由一类特殊字符及文本所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能。


正则表达式分类:

    基本正则表达式(BRE)

    扩展正则表达式(ERE)


3、grep:global search regular expression and printout the line;全文搜索每一行,对字符串及模式进行匹配,然后在输出匹配的行。


grep作用:文本搜索工具,根据用户指定的“模式(过滤条件)”,对目标文本逐行进行匹配检查,打印匹配到的行。


模式(过滤条件):是指由正则表达式的元字符及文本字符所编写出的过滤条件。


另:

grep:支持基本正则表达式,-E,支持扩展正则表达式

egrep:支持扩展正则表达式,-G,支持基本正则表达式

fgrep:不支持正则表达式元字符,可以和-E、-G一起使用;当无需用元字符去编写模式时,此命令最好


4、grep命令:

命令格式:

    grep [OPTIONS] PATTERN [FILE...]

     grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

[OPTIONS]:

    --color=auto:对匹配到的文本做高亮显示

    -i:忽略字符大小写;

    -o:仅显示匹配到的行

    -v:显示不能被模式匹配到的行

    -E:支持使用扩展的正则表达式

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

    

    -A # :被模式匹配的行后面#行显示出来;after;    

    -B # :被模式匹配的行前面#行显示出来;before;  

    -C # :被模式匹配的行前后面#行显示出来;after;  

5、基本正则表达式元字符:

分类:

    字符匹配  . [] [^]

    次数匹配  * \? \+ \{m\} \{m,n\}

    位置锚定  \< \>  \b ^ $  

    分组及引用 \( \)

分类具体介绍:

①字符匹配:

    .  :匹配任意单个字符

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

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

[[:digit:]] 0-9数字集合

[[:lower:]] 所有小写字母中的任意一个字符

[[:upper:]] 所有大写字母中的任意一个字符

[[:alpha:]] 所有大小写字母中的任意一个字符

[[:alnum:]] 所有字母及数字中的一个字符

[[:punct:]] 所有的标点符号中的任意一个字符

[[:space:]] 空格字符


②次数匹配:默认工作于贪婪模式,能匹配多长就匹配多长;

    * :匹配其前面的字符任意次;0次、1次、多次

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

    \? :匹配其前面的字符0次或1次;前面的字符至多出现一次;

    \+ :匹配其前面的字符1次或多次;前面的字符至少出现一次;

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

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

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

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

如:grep “x\{2,5\}y" test.txt


③位置锚定:

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

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

    ^PATTERN$ :用PATTERN来匹配整行;

    ^$ :空白行

    ^[[:space:]]*$ :匹配空白字符任意次;空白行,或包括空白字符的行

    \<或\b :词首锚定,用于单词的左侧,建议用\<

    \>或\b :词尾锚定,用于单词的右侧,建议用\>

注意:单词是指由非特殊字符组成的连续字符(字符串)


④分组及引用

    \( \):将一个或多个字符捆绑在一起,当作一个整体进行处理;如:\(xy\)*ab表示匹配xy出现任意次后跟ab字符的行;

注意:分组括号中模式匹配到的内容会被正则表达式引擎自动记录与内部的变量中,这些变量为:

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

    \2:模式从左侧起,第二个左括号与之匹配的右括号之间的模式匹配到的字符

    \...:模式从左侧起,第...个左括号与之匹配的右括号之间的模式匹配到的字符

如:

he likes his lover

he loves his lover

she likes her liker

she loves her liker

grep "\(l..e\).*\1 test.txt

后项引用:引用前面的分组括号中的模式所匹配到的字符。



6、扩展正则表达式元字符:

分类:

    字符匹配  . [] [^]

    次数匹配  * ? + {m} {m,n}

    位置锚定  \< \>  \b ^ $  

    分组及引用 ( )

    或

分类具体介绍:

①字符匹配:

    .  :匹配任意单个字符

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

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

[[:digit:]] 0-9数字集合

[[:lower:]] 所有小写字母中的任意一个字符

[[:upper:]] 所有大写字母中的任意一个字符

[[:alpha:]] 所有大小写字母中的任意一个字符

[[:alnum:]] 所有字母及数字中的一个字符

[[:punct:]] 所有的标点符号中的任意一个字符

[[:space:]] 空格字符


②次数匹配:默认工作于贪婪模式,能匹配多长就匹配多长;与基本正则表达式的区别是少了转义字符"\".

   * :匹配其前面的字符任意次;0次、1次、多次

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

    ? :匹配其前面的字符0次或1次;前面的字符至多出现一次;

    + :匹配其前面的字符1次或多次;前面的字符至少出现一次;

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

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

    {0,n} :匹配其前面的字符至多n次;

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

如:grep “x{2,5}y" test.txt


③位置锚定:

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

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

    ^PATTERN$ :用PATTERN来匹配整行;

    ^$ :空白行

    ^[[:space:]]*$ :匹配空白字符任意次;空白行,或包括空白字符的行

    \<或\b :词首锚定,用于单词的左侧,建议用\<

    \>或\b :词尾锚定,用于单词的右侧,建议用\>

注意:单词是指由非特殊字符组成的连续字符(字符串)


④分组及引用 与基本正则表达式的区别是少了转义字符"\".

    ( ):将一个或多个字符捆绑在一起,当作一个整体进行处理;如:\(xy\)*ab表示匹配xy出现任意次后跟ab字符的行;

注意:分组括号中模式匹配到的内容会被正则表达式引擎自动记录与内部的变量中,这些变量为:

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

    \2:模式从左侧起,第二个左括号与之匹配的右括号之间的模式匹配到的字符

    \...:模式从左侧起,第...个左括号与之匹配的右括号之间的模式匹配到的字符

如:

he likes his lover

he loves his lover

she likes her liker

she loves her liker

grep -E "(l..e).*\1 test.txt

后项引用:引用前面的分组括号中的模式所匹配到的字符。


⑤或 a|b

a|b :表示匹配整个左侧的a或整个左侧的b

如:c|Cat :表示c或者Cat

(C|c)at:表示Cat或者cat




常用的文本处理命令(7-12)

7、cut命令:文本截取命令

cut:从文件的每一行中移除片段

 格式:cut OPTION... [FILE]...

option:

    -d:定义以什么为分隔符,默认为空格

    -f:保留的字段

    -f # :保留指定字段

    -f #-# :保留字段范围

    -f #,# :保留特定列字段

如:

[root@localhost dev]# cut -d: -f1,7 /etc/passwd | head -1

root:/bin/bash

[root@localhost dev]# 


8、wc命令:统计每个文件的行数、单词数、字节数

格式:wc [OPTION]... [FILE]...

[OPTION]

    -l:统计行数

    -w:统计多少个单词

    -c:统计字节数

如:

[root@localhost dev]# wc /etc/fstab 

 11  54 465 /etc/fstab

[root@localhost dev]# 


9、sort命令:文本文件的排序行

sort [OPTION]... [FILE]...

[OPTION]

    -t char :指定分隔符char

    -k # :用于排序比较的字段

    -n :基于数值大小排序,而非字符

    -f:忽略字符大小写

    -r:逆序排列

    -u:重复的行只保留一份,重复行是指连续且相同的行;

如:

[root@localhost dev]# sort -t : -k 3 -n  /etc/passwd | head -5

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@localhost dev]# 


10、uniq命令:报告或省略重复的行

  uniq [OPTION]... [INPUT [OUTPUT]]

OPTION:

    -c:统计每一行重复出现的次数

    -u:只显示不存在重复的行

    -d:只显示存在重复的行

如:

[root@localhost dev]# cut -d: -f7 /etc/passwd | uniq 


11、diff命令:逐行比较文件中的内容:

 diff [OPTION]... FILES

生成补丁文件:diff /path/to/older /path/to/newfile >/patch_file  


12、patch命令:向文件打补丁

 patch -i 补丁文件 老文件

或patch 老文件 < 补丁文件