欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 04_04 _grep及正则表达式 有大用

文本查找(文本检索):

grep , egrep , fgrep

grep : 根据模式 搜索文本 并将符合模式(本身的意义就是做部分匹配的,不需要整个行匹配)的文本行显示出来 Global Research

Pattern:文本字符和正则表达式的元字符给合而成的匹配条件

grep [OPTIONS] PATTERN [FILE...]

    -i --ignore-case 忽略大小写

    --colour[=WHEN]--color[=WHEN] 在什么情况下匹配到了显示颜色

    -v 反向查找  显示没有被模式匹配到的行 没有匹配到的行反而显示出来.匹配到的反而不显示

    -o 只显示被模式匹配到的字符串,每一个串显示一行 (不显示整个行)

    -R 目录下递归查找

    -n 显示行号


文件名通配 globbing (通配符的意思)

*: 星号任意长度的任意字符

?: 问号任意单个字符

[]:中括号指定范围内

[^]:中括号里有尖号指定范围外 (不包括)


正则表达式: REGular EXPression,REGEXP 通配符,可能还有别的意义

元字符:

. : 点号表示匹配任意单个字符

[]: 中括号,指定范围内的任意单个字符

[^]: 中括号内含拖字符,指定范围外的任意单个字符(不包括里面的任意单个字符) (取反的)

 字符集合: [:digit:]数字 [:lower:] 小写字母[:upper:]大写字母 [:punct:] 标点符号 [:space:]空白字符 [:alpha:]所有字母 [:alnum:]所有字母和所有数字

    

匹配次数数: (默认贪婪模式)

* :  星号表示匹配其前面的字符任意次

    a , b, ab , aab , acb , adb , amnb

    a*b  a出现任意次(可以是零次)后面跟了个b 上一行红色的字都可以匹配,其它的都不匹配

    a.*b  a 后面跟任意长度的任意字符再跟个b,上面的 有下划线的都匹配,

.* 点号星号(点星号)表示任意长度的任意字符(可以是零次) 它是通吃的 (默认情况下 正则表达式工作在贪婪模式下,也就是说尽可能的匹配)


\? : 反斜杠问号,表示匹配其前面的字符1次或0次 (很可能需要使用反斜线进行转义才能使用) (也是作匹配次数使用的)

\{m,n\}:表示匹配其前面的字符,至少m次,至多n次  (反斜杠是转义的意思,假如不加反斜杠,花括号就会被shell解析(解释),bash中,花括号就是命令行展开,加上转义的反斜杠后,告诉bash别展开,当正则表达式来使用)

    \{1,\} 表示匹配其前面的字符至少一次,多了不限

    \{0,3\} 表示匹配其前面的字符至少0次,至多3次


位置锚定:

^: 尖号(拖字符) 锚定行首 此字符后面的任意内容必须出现在行首

$: 美元符号 锚定行尾 此字符前面的任意内容必须出现在行尾

^$ : 空白行 空行


\<  或 \b:锚定词首,其后面的任意字符必须作为单词的首部出现  (r55t 可看作一个单词, r::5不可看作一个单词)

\>  或 \b:锚定词尾,其前面的任意字符必须作为单词的尾部出现

    \<root\> 找 root 这个单词 作为词首,词尾均需满足,只能作为一个单词来看待


分组:

\(\)

    \(ab\)*    ab 可以出现一次或零次或任意次

    后向引用 (前向引用)

    \1 : 表示前面第一个括号中出现的内容 (引用第一个左括号以及与之对应的右括号所包括的所有内容)         (就算括号里有嵌套,也是从左往右数,第一个左括号表示\1,第二个左括号表示\2)

    \2 :

    \3 :




    He love his lover.

    She like her liker.

    He like his lover.

    

l..er






# man grep 

image.png

image.png

image.png

单引号 强引用 双引号 弱引用 其实这里只要不涉及到变量的使用 单双引号都可以

如果不涉及到有关正则表达式的元字符的话 不加引号也可以


# grep 'root' /etc/passwd

image.png

[root@ebs-22618 ~]# grep -i 'root' /etc/passwd

image.png

[root@ebs-22618 ~]# grep --color 'root' /etc/passwd

image.png

[root@ebs-22618 ~]# alias grep='grep --color'      给检索颜色起个别名

[root@ebs-22618 ~]# grep  'root' /etc/passwd

image.png

[root@ebs-22618 ~]# grep -v  'root' /etc/passwd

image.png

[root@ebs-22618 ~]# grep -o  'root' /etc/passwd

image.png

[root@ebs-22618 ~]# grep -Rn  'root' /etc/passwd

image.png

[root@ebs-22618 ~]# grep   'r..t' /etc/passwd  检索r和t中间跟了两个字符的

image.png


[root@ebs-22618 ~]# nano test.txt

image.png

[root@ebs-22618 ~]# grep 'a.*b' test.txt

image.png

[root@ebs-22618 ~]# grep 'a*b' test.txt

image.png

[root@ebs-22618 ~]# grep 'a\?b' test.txt

image.png

[root@ebs-22618 ~]# grep 'a\{1,3\}b' test.txt

image.png

[root@ebs-22618 ~]# grep 'a.\{1,3\}b' test.txt

image.png

[root@ebs-22618 ~]# grep   'r..t' /etc/passwd

image.png

[root@ebs-22618 ~]# grep '^r..t' /etc/passwd

image.png

[root@ebs-22618 ~]# grep 'w$' /etc/inittab

image.png

[root@ebs-22618 ~]# grep 'b..h$' /etc/passwd

image.png

[root@ebs-22618 ~]# cat /tmp/aaaa.txt

image.png

[root@ebs-22618 ~]# grep '^$' /tmp/aaaa.txt

image.png

[root@ebs-22618 ~]# grep '^$' /tmp/aaaa.txt | wc -l

image.png

[root@ebs-22618 ~]# grep '[[:digit:]]$' /etc/inittab  匹配以一个数字结尾的

image.png

image.png

[root@ebs-22618 ~]# grep '[[:space:]][[:digit:]]$' /etc/inittab 匹配以一个空格加一个数字结尾的

当然多个空格加一个数字结尾的肯定也能匹配到

image.png


[root@ebs-22618 ~]# nano test2.txt

image.png

[root@ebs-22618 ~]# grep "root\>" test2.txt

image.png

[root@ebs-22618 ~]# grep "\<root" test2.txt

image.png

[root@ebs-22618 ~]# grep "\<root\>" test2.txt

image.png

\< 和 \> 可以用 \b 来代替

image.png

[root@ebs-22618 ~]# cat test.txt

image.png

[root@ebs-22618 ~]# grep "\(ab\)*" test.txt

image.png


[root@ebs-22618 ~]# nano test3.txt

image.png

[root@ebs-22618 ~]# grep 'l..e' test3.txt

image.png

[root@ebs-22618 ~]# grep 'l..e.*l..e' test3.txt

image.png

[root@ebs-22618 ~]# nano test3.txt

image.png

image.png

[root@ebs-22618 ~]# grep '\(l..e\).*\1' test3.txt

image.png

[root@ebs-22618 ~]# grep '\([0-9]\).*\1$' /etc/inittab

image.png










普通分类: