grep正则表达式


一、前言

   grep是功能强大的文本处理工具,全称:global search regular expression and print out the line,grep一行一行使用正则表达式匹配文本,之后对匹配到的文本整行显示(除非使用特定的选项取反,如 grep -v)。


二、grep用法

grep命令用法:        

   grep [OPTIONS] PATTERN [FILE…]

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

   为了使用grep用法,我们不得不先简单学习下正则表达式


2.1、正则表达式用法

  首先,我们要明白什么是正则表达式?所谓正则表达式就是使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。正则表达式由一些普通字符和元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。


2.1.1、基本正则表达式的元字符用法

a:字符匹配

. 匹配任意单个字符 例如:grep 'roo.' /etc/passwd
[] 匹配指定范围内的任意单个字符  例如:grep '[ro]' /etc/passwd
[^] 取反  例如:grep '[^ro]' /etc/passwd                          

b:次数匹配

* 匹配任意次数 例如: grep 'roo*' /etc/passwd
\? 匹配其前面字符出现0或者1次 例如: grep 'roo\?' /etc/passwd
\{m\} 匹配其前面字符出现m次  例如: grep 'ro\{2\}' /etc/passwd
\{m,\} 匹配其前面字符最少出现m次  例如: grep 'ro\{2,\}' /etc/passwd
\{m,n\} 匹配其前面字符最少出现m次,最多n次 例如: grep 'ro\{2,3\}' /etc/passwd
\{0,n\} 匹配其前面字符最多n次  例如: grep 'ro\{0,2\}' /etc/passwd              

c:位置锚定匹配

^ 行首锚定符  例如:grep '^root' /etc/passwd
$ 行尾锚定符 例如:grep 'shell$' /etc/passwd
\< 词首锚定符 例如:grep '\<root' /etc/passwd
\> 词尾锚定符  例如:grep 'shell\>' /etc/passwd                         

d:分组

\(\) 分组,分组中模式匹配的内容可被引用 例如:grep '\(root\).*\1' /etc/passwd        

e:引用

\# 引用分组中第#个内容(#为数字) 例如:grep '\(root\).*\1' /etc/passwd       

2.1.2、扩展正则表达式的元字符用法

a:字符匹配

. 匹配任意单个字符  例如:egrep 'roo.' /etc/passwd
[] 匹配指定范围内的任意单个字符 例如:egrep '[ro]' /etc/passwd
[^] 取反  例如:egrep '[^ro]' /etc/passwd                         

b:次数匹配

* 匹配任意次数 例如: egrep 'roo*' /etc/passwd
+ 匹配前面字符出现1次以上 例如: egrep 'root' /etc/passwd
? 匹配其前面字符出现0或者1次 例如: egrep 'roo?' /etc/passwd
{m} 匹配其前面字符出现m次 例如: egrep 'ro{2}' /etc/passwd
{m,} 匹配其前面字符最少出现m次 例如: egrep 'ro{2,}' /etc/passwd
{m,n} 匹配其前面字符最少出现m次,最多n次  例如: egrep 'ro{2,3}' /etc/passwd
{0,n} 匹配其前面字符最多n次  例如: egrep 'ro{0,2}' /etc/passwd          

c:位置锚定匹配

^ 行首锚定符  例如:egrep '^root' /etc/passwd
$ 行尾锚定符  例如:egrep 'shell$' /etc/passwd
\< 词首锚定符 例如:egrep '\<root' /etc/passwd
\> 词尾锚定符  例如:egrep 'shell\>' /etc/passwd                    

d:分组

( ) 分组,分组中模式匹配的内容可被引用 例如:egrep '(root\).*\1' /etc/passwd   

e:或者

| 或者  例如: egrep 'bash|nologin' /etc/passwd                    

f:引用

\number 引用第几个匹配 例如 grep '(12).*\1' /etc/passwd

2.3 grep常用的选项

-v 反向选择 例如:grep -v 'root' /etc/passwd
-o 仅显示匹配的字符串本身,而非所在行  例如:grep -o 'root' /etc/passwd
-i 忽略大小写  例如:grep -i 'root' /etc/passwd
-E 支持使用扩展正则表达式  例如:grep -E '(root).*\1' /etc/passwd
-A 后面n行  例如:grep -A 3 'root' /etc/passwd
-B 前面n行 例如:grep -B 3 'mysql' /etc/passwd
-C 前后各n行 例如:grep -C 3 'mysql' /etc/passwd                      

三、例题

3.1、显示/etc/passwd文件中以bash结尾的行

grep '\<bash\>$' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    leon:x:500:4400::/home/leon:/bin/bash
    mandirva:x:2200:4400::/home/mandirva:/bin/bash
    ......
    centos:x:2241:2241::/home/centos:/bin/bash
    user1:x:2242:2242::/home/user1:/bin/bash

3.2、显示/etc/passwd文件中的两位数或三位数

grep '\<[[:digit:]]\{2,3\}\>' /etc/passwd
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
    saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    leon:x:500:4400::/home/leon:/bin/bash
    openstack:x:501:501:This's openstack:/home/openstack:/bin/bash

3.3、显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行

netstat -tan | grep 'LISTEN'[[:space:]]* 
    tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
    tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
    tcp        0      0 :::22                       :::*                        LISTEN      
    tcp        0      0 ::1:25                      :::*                        LISTEN

3.4、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行

grep '^\([[:alnum:]]*\):.*\1$' /etc/passwd
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    nologin:x:2208:2208::/home/nologin:/sbin/nologin

3.5、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)

grep -E '^root|^centos|^user1' /etc/passwd | cut -d: -f1,3,7
    root:0:/bin/bash
    centos:2241:/bin/bash
    user1:2242:/bin/bash

3.6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行

grep -E '\<[[:alpha:]]+_?\(\)' /etc/rc.d/init.d/functions 
    checkpid() {
    daemon() {
    killproc() {
    pidfileofproc() {
    pidofproc() {
    status() {
    success() {
    failure() {
    passed() {
    warning() {
    action() {
    strstr() {
    confirm() {

3.7、使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名

echo /etc/passwd | egrep -o '[[:alnum:]]+$' 
    passwd
echo /etc/passwd | egrep -o '^(/).*\1' 
    /etc/

3.8、找出ifconfig命令执行结果中1-255之间的数字

ifconfig | grep -Eo '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' | sort | uniq
    1
    2
    6
    8
    27
    41
    56
    64
    75
    101
    106
    127
    128
    168
    192
    255


你可能感兴趣的:(grep,search,表达式,expression,regular)