8.14 grep与正则表达式

1、grep程序
  Linux下有文本处理三剑客 -- grep sed awk
    grep:文本行过滤工具
    sed:文本行编辑器(流编辑器,一行一行编辑)
    awk:报告生成器(做文本输出格式化)

    grep
       包含三个命令:grep egrep fgrep他们是用来进行 行模式(pattern)匹配的
       egrep=grep -E 使用扩展的正则表达式进行匹配
       fgrep=fast grep 只使用文件通配符进行匹配
       grep默认使用则正表达式进行文本匹配

    grep的用法:
      grep[option]...PATTERN[filename]

    grep的常见选项 --option
      -E 支持使用扩展的正则表达式(ERE)(regexp)
      -P 使用perl语言的正则表达式引擎进行搜索(每一种语言的正则表达式引擎都不相同,甚至sed grep wak使用的regexp引擎)
      -i 忽略大小
      -v进行反选
      -o仅仅输出匹配的内容(默认输出的是匹配到的行)
      --color=auto 语法着色
      -n 显示行号

2、PATTERN--正则表达式
      作用:通过一些特殊字符,来表示一类字符内容,然后交给前面的命令来执行;如果使用特殊字符本身含义,就需要使用\进行转义;

      文件通配符(globbing):
             * ? [] [^ ]

        1、字符匹配
          . 任意一个字符 ?
          [] 范围内的任意一个字符
          [^ ] 范围任意一个字符
          [0-9]
        2、次数匹配
          * 匹配前面的字符0次到无数次
          ? 匹配前面的字符0次到1次
          + 匹配前面的字符1次到n次
          \{m\} 匹配前面的字符m次
          a\{7\}aaaaaaa
          \{m,n\} 匹配前面的字符m到n次
          \{m,\} 匹配前面的字符至少m次
        3、位置锚定
          ^ 锚定行首
          $ 锚定行尾
          \b 锚定词首和锚定词尾
          \> 锚定词尾
          <\ 锚定词尾
        4、分组
          abc* abcccccc abc看做一个整体、
          \(\) 示例: \(abc\) abcabcabc abcccc
          分组特性:默认情况下,linux系统会为分组指定变量,变量的表示形式 \1 \2 \3

          \(\(立秋\)已过\),\(香港\)依旧不宁。多区出现非法集会,\(暴力\)示威者破坏公物、堵塞干道,或以激光、砖块袭警、投掷汽油弹,更有甚者公然殴打内地游客及记者。随着示威升级,怂恿“反中乱港”的幕后势力也正慢慢浮现。

          示例:\(ab+\(xy\)*\) 其中 \1 = ab+\(xy\)* , \2 = xy
           abbbbbxyxyxyabxy

练习:
1、显示/proc/meminfo文件中大小s开头的行
grep -i "^s" /proc/meminfo
2、显示/etc/passwd文件中不以/bin/bash结尾的行
grep -v "/bin/bash$" /etc/passwd
3、显示/etc/passwd文件中UID号最大的用户的用户名
sort -n -t: -k3 /etc/passwd | tail -1 | cut -d: -f1
4、如果用户root存在,显示其默认的shell程序
grep "^root\>" /etc/passwd &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7
id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7
5、找出/etc/passwd中的两位或三位数
grep "[0-9]\{2,3\}" /etc/passwd
-w //匹配固定单词
\<[0-9]\{2,3\}\>
\b[0-9]\{2,3\}\b
6、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面为非空白字符的行
grep "^[[:space:]]\+.*[^[:space:]]$" /etc/rc.d/rc.sysinit
7、找出”netstat -tan”命令的结果中,以“LISTEN”后跟0、1或多个空白字符结尾的行
netstat -tan | grep "LISTEN[[:space:]]*$"
8、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin):而后找出/etc/passwd文件中用户名同shell名的行
useradd bash /bin/bash
useradd testbash
useradd basher
useradd -s /sbin/nologin nologin
grep "\(^[[:alnum:]]\+\>\).*\1$" /etc/passwd
9、IP地址如何匹配?
ip地址:
0-255.0-255.0-255.0-255
0-255
2 0-4 0-9 2[0-4][0-9]
2 5 0-5 25[0-5]
1 0-9 0-9 1[0-9][0-9]
0 0-9 0-9 [0-9][0-9]
0 0 0-9 [0-9]

2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[0-9][0-9]|[0-9]\.2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[0-9][0-9]|[0-9]\.2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[0-9][0-9]|[0-9]\.2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[0-9][0-9]|[0-9]
\((2[0-4][0-9])|(25[0-5])|(1[0-9][0-9])|([0-9][0-9])|([0-9])\)\.\1\.\1\.\1


\<[1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3]\>
1-9
1-9 0-9
1 0-9 {2}
2 [01] 0-9 200 - 219
2 2 0-3 220 - 223

\(\.\<[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4]\>\){2}
0-9
1-9 0-9
1 0-9 0-9
2 0-4 0-9
2 5 0-4
\( \){2}

\.\<[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4]\>
1-9
1-9 0-9
1 0-9 0-9
2 0-4 0-9
2 5 0-4

 

posted @ 2019-08-14 20:26  酒友az  阅读(230)  评论(0编辑  收藏  举报