基础正则表达式及grep相关操作

正则表达式常见操作,这里也引用鸟哥私房菜中提及的,鸟哥编辑的txt文档.

文档下载地址:

wget https://linux.vbird.org/linux_basic/0330regularex/regular_express.txt

需要记住的特殊符号,如下:

[:alnum:] : 代表英文大小写字符及数字,即0-9,A-Z,a-z;

[:alpha:] : 代表英文大小写字符,即a-z,A-Z;

[:blank:] : 代表空格键与Tab按键;

[:cntrl:] : 代表键盘上面的控制按键,即包括CR,LF,Tab,Del等;

[:digit:] : 代表数字,即0-9;

[:graph:] : 除了空格符(空格键与Tab按键)外的其他所有按键;

[:lower:] : 代表小写字符,即a-z;

[:print:] : 代表可以被打印出来的字符;

[:punct:] : 代表标点字符,即” ? ! # $等;

[:upper:] : 代表大写字符,即A-Z;

[:space:] : 任何会产生空白的字符,包括空格键Tab CR等;

[:xdigit:] : 代表十六进制的数字类型,因此包括0-9, A-F, a-f的数字和字符;

需要记住的RE特殊字符,如下

^word : 待查找的字符串word在行首;

word$ : 待查找的字符串word 在行尾;

.      : 代表一定有一个任意字符的字符;

\      : 转义字符,将特殊符号的特殊意义去除;

*     : 重复0个到无穷多个前一个字符;

[list]  : 从字符集合的RE字符里面找出想要选取的字符;

[n1-n2] : 从字符集合的RE字符里面找出想要选取的字符范围;

[^list] : 从字符集合的RE字符里面找出不想要字符串或范围;

\{\n,m} : 连续n到m个前一个RE字符,若为\{n\}则是连续n个的前一个RE字符,若为\{n,\}

则是连续n个以上的前一个RE字符.

实例1:查找特定字符串

这里以”the”这个特定字符串为例,如下:

# grep -n “the” regular_express.txt

8:I can’t finish the test.

12:the symbol ‘*’ is represented as start.

15:You are the best is mean you are the no. 1.

16:The world <Happy> is the same with “glad”.

18:google is the best tools for search keyword.

若想反向选择,也就是显示出没有”the”字符串的行,就可以使用-v选项,如下:

# grep -vn “the” regular_express.txt

若想显示像”The”、”THE”等字符串,就可以使用-i选项,来忽略大小写,如下:

# grep -in “the” regular_express.txt

实例2:利用中括号[]来查找集合字符

[]中不论有几个字符,它都只代表某”一个”字符,如我们查找test 和tast这两个字符串时,可以如下:

# grep -n “t[ae]st” regular_express.txt

8:I can’t finish the test.

9:Oh! The soup taste good.

若我们想查找有oo字符串的行,如下:

# grep -n “oo” regular_express.txt

同上,若不想oo前有g这个字符的话,可以如下:

# grep -n “[^g]oo” regular_express.txt

同上,若不想oo前面有小写字符,可以如下;

# grep -n “[^a-z]oo” regular_express.txt

或者使用特殊字符,如下:

# grep -n “[^[:lower:]]oo” regular_express.txt

同上,若想查找有数字的行,可以如下:

# grep -n “[0-9]” regular_express.txt

或者使用特殊字符,如下:

# grep -n “[[:digit:]]” regular_express.txt

实例3:行首与行尾字符^$

若我们想列出开头是小写字符的行,可以如下:

# grep -n “^[a-z]” regular_express.txt

若我们想列出结尾是小数点(.)的行,特别注意,小数点具有其他意义,必须使用转义字符(\)来加以解除其特殊意义.如下

# grep -n “\.$” regular_express.txt

若想显示”空白行”,可以如下:

# grep -n “^$” regular_express.txt

特别很多时候,我们查看文件时,不想显示”空白行”和”#注释行”,可以如下:

# grep -v “^$” regular_express.txt | grep -v “^#”

若不想开头是英文字母,可以这样:

# grep -n “^[^a-zA-Z]” regular_express.txt

特别注意,那个^符号在字符集合符号(中括号[])之内与之外是不同的!在[]内代表”反向选择”,在[之外则代表定位在行首的意义.]

实例4:任意一个字符 . 与重复字符*

在bash中,通配符*可以用来代表任意(0或多个)字符,但是正则表达式并不是通配符,两者之间是不同的.至于正则表达式当中,”.”则代表绝对有一个任意字符的意思.

.(小数点) : 代表一定有一个任意字符的意思;

*(星号) : 代表重复前一个0到无穷多次的意思,为组合形态;

若我们想要找出g??d的字符串,即共有四个字符,我们可以这样:

# grep -n “g..d” regular_express.txt

因为*代表的是重复0或多个前面的RE字符的意义,因此,”o*”代表的是具有空字符或一个o以上的字符,特别注意,因为允许空字符,因此,”# grep -n “o*” regular_express.txt ”将会把所有的数据都列出来.

那如果”oo*”呢?则第一个o肯定必须存在,第二个o则是可有可无的多个o,所以含有o, oo, ooo等,都可以列出来.

可以这样:

# grep -n “ooo*” regular_express.txt

# grep -n “goo*d” regular_express.txt

若想列出g开头与g结尾的字符串呢?可以如下:

# grep -n “g.*g” regular_express.txt

g开头语g结尾,即表示g…g这样的字符串,可以使用”.*”来代表0个或任意字符的意思.

实例5:限定连续RE字符范围{}

若我们想要找出2-5个o的连续字符串,该如何做?这时候就得要使用到限定范围的字符{}了.但因为{与}的符号在shell是有特殊意义的,因此,我们必须要使用转义字符\来让它失去特殊意义才行.如下:

查找两个o的字符串,可以这样:

# grep -n “o\{2\}” regular_express.txt

若想查找g后面接2到5个o,然后再接一个g的字符串呢?可以这样:

# grep -n “o\{2,5\}g” regular_express.txt