Linux——grep及正则表达式

文本查找(grep,egrep,fgrep)
grep:Global Research根据模式去搜索文本,并将符合模式的文本行显示出来。
Pattern(模式):由文本字符和正则表达式的元字符所组合而成的匹配条件

  • grep [options] PATTERN [FILE...] 如:grep 'root' /etc/passwd
    -i:忽略大小写(ignore case)
    --color
    -v:显示没有被模式匹配到的行
    -o:只显示被模式匹配到的字符串

  • 正则表达式:REGular EXpression REGEX
  • 正则表达式:里面有一些元字符,这些元字符不是其本身的意义,而有通配的意义。

与学习bash的基本概念中的文件通配符不同,在文件通配中:
星号 * :可以匹配任意长度的任意字符
?:匹配任意单个个字符
[ ] :匹配指定范围内的任意单个字符
然而元字符与之不同。


元字符:
. : 匹配任意单个字符
[ ] : 匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
字符集合:[:digit:], [:lower:], [:upper:], [:punct:], [:space:], [:alpha:], [:alnum:]

匹配次数(贪婪模式,尽可能长的匹配):
星号 ※:匹配其前面的字符任意次

例如:a, b, ab, aab, acb, adb, amnb
a * b :b,ab,aab
a . b:aab,acb,adb
a. * b :ab, aab, acb, adb, amnb
a/?b:
.*: 任意长度的任意字符   

\?: 匹配其前面的字符1次或0次(使用时加上 ' ')
\ { m , n \ }:匹配其前面的字符至少m次,至多n次
\ { 1 , \ }:最少一次
\ { 0 , 3 \ }:最多三次
  • 位置锚定:(必须出现在某个位置)
    ^: 锚定行首,此字符后面的任意内容必须出现在行首
    grep '^r..t' /etc/passwd
    $: 锚定行尾,此字符前面的任意内容必须出现在行尾
    grep 'b..h$' /etc/passwd
    ^$: 空白行

    正则表达式中词的概念:11adc11像这种数字单词组合在一起的也相当于词,词中特殊字符的话不算一个词。
    \>或\b: 锚定词首,放在最前面,其后面的任意字符必须作为单词的首部出现
    \<或\b: 锚定词尾,放在最后面,其前面的任意字符必须作为单词的尾部出现
    
    分组:
    \(\):将内容进行分组
        \(ab\)*:把ab当作一个组,ab可以出现一次,零次或任意一次。 
        后向引用
        \1: 引用第一个左括号以及与之对应的右括号所包括的所有内容
        \2:
        \3:

扩展正则表达式(grep -E或egrep,grep -E = egrep )
REGEXP:REGular EXPression
Pattern(模式):由文本字符和正则表达式的元字符所组合而成的匹配条件

正则表达式:
Basic REGEXP:基本正则表达式
Extended REGEXP:扩展正则表达式
他们所支持的元字符有一部分不一样,甚至有些元字符的意义也不相同。

grep:使用基本正则表达式定义的模式来过滤文本的命令;
-i :忽略大小写(ignore case)
-v:显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串
--color
-E: 使用扩展正则表达式
-A n:不但显示匹配到的行,还像是这行的后n行(after)
-B n:不但显示匹配到的行,还像是这行的前n行(before)
-C n:不但显示匹配到的行,还像是这行的前后n行

扩展正则表达式:

  • 字符匹配(与基本正则表达式相同):
    . : 匹配任意单个字符
    [ ] : 匹配指定范围内的任意单个字符
    [^]:匹配指定范围外的任意单个字符

    次数匹配(与基本正则表达式有些不同):
    *:   匹配其前面的字符任意次    
    ?:不需要加反斜线,匹配其前面的字符1次或0次
    +: 匹配其前面的字符至少1次 ( 相当于  \ ( 1 , \ ))
    {m,n}:不需要使用反斜线,匹配其前面的字符至少m次,至多n次
    
    位置锚定:(与基本正则表达式相同)
    ^: 锚定行首,此字符后面的任意内容必须出现在行首
    $: 锚定行尾,此字符前面的任意内容必须出现在行尾
    ^$: 空白行
    \>或\b: 锚定词首,放在最前面,其后面的任意字符必须作为单词的首部出现
    \<或\b: 锚定词尾,放在最后面,其前面的任意字符必须作为单词的尾部出现
    
    分组:不需要加反斜线,与基本正则表达式相同
    ():分组
    \1, \2, \3, ...
    
    或者(扩展正则表达式的特殊字符)
    |:or
    C|cat:C或cat
    (C|c)at:Cat或cat(分组的用法) 
    grep -E = egrep 

练习:

  • 显示所有以数字结尾且文件名中不包含空白的文件:
    ls [^[:space:]][0-9] ?????????

  • 找出ifconfig命令结果中的1-255之间的整数:使用ifconfig通道加egrep
    ifconfig | egrep --colour ’\<([ 1 - 9 ] | [ 1 - 9 ] [ 0 - 9 ] | 1 [ 0 - 9 ] [ 0 - 9 ] | 2 [ 0 - 4 ] [ 0 - 9 ] | 25 [ 0 - 5 ])\>’
    (使用或字符将0-9,10-99,100-199,200-249,250-255这四个范围或起来,再加上词首词尾锚定,注意加括号!!!)

  • 找出ifconfig命令结果中合适的ip地址:(首先得匹配0-255,其次还得匹配ip地址中间的 . 点这个字符)
    加 / . 表示的就是匹配点这个字符
    ifconfig | egrep -o '\<([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])\> . \<([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])\>'
  • 或者也可以简写成
    ifconfig | egrep --color '(\<([0-9] | [1-9][0-9] | 1[0-9][0-9] | 2[0-4][0-9] | 25[0-5])\> .){3} \<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]) \> ' 
    (先重复三次因为四个数字只有三个点字符,在加上一次匹配0-255)

IP简述
IPv4: 分五类A B C D E,有用的只有A,B,C
A:1-127
B:128-191
C:192-223

使用正则表达式找出可用的ip地址:
\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>(.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>


grep,egrep,fgrep:文本查找

文件查找:

  • locate:
    非实时,模糊匹配,查找是根据全系统文件数据库进行的;
    系统刚装好时,可能实行不了这个命令,要用updatedb, 手动生成文件数据库命令。
    速度快但不精确。

  • find:
    实时,精确
    支持众多查找标准,支持正则表达式
    遍历指定目录中的所有文件完成查找,速度慢;

  • find 查找路径 查找标准 查找到以后的处理运作
    查找路径:默认为当前目录
    查找标准:默认为指定路径下的所有文件
    处理运作:默认为显示

  • 匹配标准:

    -name 'FILENAME':根据文件名作精确匹配
        文件名通配:比如 find /etc -name '*passwd*'比配在/etc下文件名有passwd的文件
            *:任意长度的任意字符
            ?:任意单个字符
            [ ]:指定范围内的任意单个字符
    -iname 'FILENAME': 文件名匹配时不区分大小写
    -regex PATTERN:基于正则表达式进行文件名匹配
    
    -user USERNAME: 根据属主查找
    -group GROUPNAME: 根据属组查找
    -uid UID: 根据UID查找
    -gid GID: 根据GID查找
    
    -nouser:查找没有属主的文件
    -nogroup: 查找没有属组的文件

猜你喜欢

转载自blog.csdn.net/sinat_39440759/article/details/82919567