linux grep egrep fgrep 正则表达式:

grep是一个最初用于Unix操作系统的命令行工具。在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本。


grep命令:

命令语法:

grep [OPTIONS] PATTERN [FILE...]

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

-i:忽略大小写对文件内容进行匹配。

-v:反向匹配,根据用户输入的信息取反。

-o: 输入匹配的是什么,输出的就是什么,而不是显示匹配字串的一整行。

-E:grep的扩展,或者使用egrep命令。

--color: 匹配到的字符显示颜色。


示例:

直接搜索root所在行:



# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin



忽略大小写搜索:

#grep -i 'abcDEFg' test.txt 

ABCDEFG

abcdefg

ABcdefg

abcdeFG


反向搜索:

#grep -v 'ABCDEFG' test.txt 

abcdefg

ABcdefg

abcdeFG


只显示匹配到的字符而不是一行:

#grep -o 'ABC' test.txt 

ABC


*)grep -E 或者 egrep 的基本命令都是差不多一致的。


正则表达式:regex


正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。


基本正则表达式:grep


fgrep: 不支持使用正则表达式,如果输入'*',直接匹配文本字面意思,就只匹配文本内带'*'的行。


基本正则表达式元字符:

字符匹配:

.  : 匹配任意'单个'字符,包括标点符号,特殊字符。

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

[^]: 反向匹配任意单个字符。


针对[]又有几个扩展的元字符:





*)这里也支持一些字符合集,写在后面了。


次数匹配元字符:

用于实现'指定前面字符'所能够出现的次数。









位置锚定:

^ : 行首锚定,写在匹配字符的左侧。

$ :行尾锚定,写在匹配字符的右侧。

^$: 空白行。

\<: 词首,出现于单词左侧 \b。

\>: 词尾,出现于单词右侧 \b。


分组:

分组是因为被匹配的内容在文件中出现多次,而不需要多次输入同样的信息去匹配。


\(\):在括号内,可以出现任何正确的正则表达式匹配。

\(\) \1 :引用第一个左括号以及与之对应的右括号所包括的所有内容。


字符集合:

数字:[:dihit:]

小写字母:[:lower:]

大写字母:[:upper:]

标点符号:[:punct:]

空白字符:[:space:]

所有字母:[:alpha:]

所有数字:[:alnum:]


*)在引用字符合集的时候需要如[[:space:]]这样使用。


一些egrep所支持的正则表达式匹配模式在grep里也可以实现,例如:\|(或) \+(前面的字符至少出现1次)等,都是需要加\转义。


扩展正则表达式: egrep


*)元字符匹配与grep基本正则表达式匹配一致,包括位置锚定,字符合集。


次数匹配:

* :星号在扩展正则表达式和基本正则表达式匹配一至,并且在基本正则表达式中不用加\进行转义。

? :匹配前面的字符可以出现任意次,包括0次。

+ :匹配前面的字符至少出现1次。

{m}: 匹配前面的字符至少出现m次。

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


分组:

()\1: :引用第一个左括号以及与之对应的右括号所包括的所有内容。


或者:



正则表达式示例:

正则表达式可以进行组合匹配。


匹配/etc/passwd文件中有多少个以/sbin/nologin结尾的。



grep '.*:/sbin/nologin$' /etc/passwd
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




匹配 /boot/grub/grub.conf至少一个空白字符开头的行统计行数。

grep  '^[[:space:]]\{1,\}'  /boot/grub/grub.conf | wc -l

3


匹配/boot/grub/grub.conf以#号开头,后面至少一个空白符的行。

grep  '^#[[:space:]]\{1,\}.*'  /boot/grub/grub.conf 
# grub.conf generated by anaconda
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/mapper/vg0-root
#          initrd /initrd-[generic-]version.img


匹配一个合理的IPV4地址:

1、A类:1-127

2、B类:128-191

3、C类:192-223


我这边匹配的范围是:

1.0.0.1-239.255.255.255




ifconfig  | egrep '\<([1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-3][0-9]|23[0-9])\>'.'\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'.'\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'.'\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
          inet addr:192.168.0.103  Bcast:192.168.0.255  Mask:255.255.255.0
          inet addr:192.168.0.102  Bcast:192.168.0.255  Mask:255.255.255.0
          inet addr:127.0.0.1  Mask:255.0.0.0



我这边是用笨方法匹配的,最后看了下网上很多的匹配,比这个要简化好多。

匹配思路:

1.0.0.1-239.255.255.255

第一位数(第一个小数点的前一位)的匹配最小是1,最大是239。第二位数的匹配最小是0,最大是255,第三位和第二位一样。第四位是最小1,最大255.

    第一位数:

    个位数:1-9

    十位数:10到100 [0-9][0-9]

    百位数:100到199 1[0-9][0-9]。200到239 2[0-3][0-9],239是23[0-9]

    百位数解释:200-249,2[0-4][0-9]。240-249,24[0-9]。



总结反思:    不要看到人家的一长串代码而感到头大,一个一个慢慢对照自己所会的正则匹配,一点一点理出头绪。进行匹配的时候,要注意匹配要求,确定是要锚定开头还是行尾,先考虑下后在进行匹配。一般次数匹配前面都会出现一些字符,要求这个字符出现多少多少次。词首词尾锚定是根据单词来锚定的。我出现问题比较多的就是习惯性把次数放在前面,例如用我最初的理解匹配:开头至少一个空白符'^\+[[:space:]]':。实际写法是'^[[:space:]]\+',锚定行首,前面空白字符至少出现1次。总之就是稍微细心些就好。




转载于:https://blog.51cto.com/54276311/1436196