grep&正则表达式

grep&正则表达式

grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

语法

    grep [选项]... PATTERN [FILE]...

选项

-a 不要忽略二进制数据。
-A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-c 计算符合范本样式的列数。
-C<显示列数>或-<显示列数>  除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> 指定字符串作为查找文件内容的范本样式。
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F 将范本样式视为固定字符串的列表。
-G 将范本样式视为普通的表示法来使用。
-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i 忽略字符大小写的差别。
-l 列出文件内容符合指定的范本样式的文件名称。
-L 列出文件内容不符合指定的范本样式的文件名称。
-n 在显示符合范本样式的那一列之前,标示出该列的编号。
-q 不显示任何信息。
-R/-r 此参数的效果和指定“-d recurse”参数相同。
-s 不显示错误信息。
-v 反转查找。
-w 只显示全字符合的列。
-x 只显示全列符合的列。
-y 此参数效果跟“-i”相同。
-o 只输出文件中匹配到的部分。

正则表达式

^word           搜寻以word开头的行。 例如:搜寻以#开头的脚本注释行 grep –n '^#' /PATH/TO/FILENAME
word$           搜寻以word结束的行
.               匹配任意一个字符。 例如:grep –n 'e.e regular.txt 匹配e和e之间有任意一个字符,可以匹配eee,eae,eve,但是不匹配ee。
\               转义字符。 例如:搜寻’,’是一个特殊字符,在正则表达式中有特殊含义。必须要先转义。grep –n '\,' /PATH/TO/FILENAME
*               前面的字符重复0到多次。 例如匹配gle,gogle,google,gooogle等等 grep –n 'go*gle' /PATH/TO/FILENAME
[list]          匹配一系列字符中的一个。 例如:匹配gl,gf。grep –n 'g[lf]' /PATH/TO/FILENAME
[n1-n2]         匹配一个字符范围中的一个字符。 例如:匹配数字字符 grep –n '[0-9]' /PATH/TO/FILENAME
[^list]         匹配字符集以外的字符 例如:grep –n '[^o]' /PATH/TO/FILENAME 匹配非o字符
\<word          匹配单词开头。 例如:匹配以g开头的单词 grep –n '\<g' /PATH/TO/FILENAME
word\>          匹配单词结尾 例如:匹配以tion结尾的单词 grep –n 'tion\>' /PATH/TO/FILENAME
word\{n1\}      前面的字符重复n1 例如:匹配google。 grep –n 'go\{2\}gle' /PATH/TO/FILENAME
word\{n1,\}     前面的字符至少重复n1 例如:匹配google,gooogle。 grep –n 'go\{2\}gle' /PATH/TO/FILENAME
word\{n1,n2\}   前面的字符重复n1,n2次 例如:匹配google,gooogle。 grep –n 'go\{2,3\}gle' /PATH/TO/FILENAME

扩展正则表达式

?    匹配0个或1个在其之前的那个普通字符。
      例如,匹配gd,god   grep –nE 'go?d' /PATH/TO/FILENAME

+    匹配1个或多个在其之前的那个普通字符,重复前面字符1到多次。 
     例如:匹配god,good,goood等等字符串。
     grep –nE 'go+d' /PATH/TO/FILENAME

()   表示一个字符集合或用在expr中,匹配整个括号内的字符串,
     原来都是匹配单个字符。 例如:搜寻good或者glad
     grep –nE 'g(oo|la)' /PATH/TO/FILENAME

|    表示“或”,匹配一组可选的字符,或(or)的方式匹配多个字串。
     例如:grep –nE 'god|good' /PATH/TO/FILENAME 匹配god或者good。

常用的集合方法

[:alnum:]       匹配任意一个字母或数字字符
[:alpha:]       匹配任意一个字母字符(包括大小写字母)
[:blank:]       空格与制表符(横向和纵向)
[:digit:]       匹配任意一个数字字符
[:lower:]       匹配小写字母
[:upper:]       匹配大写字母
[:punct:]       匹配标点符号
[:space:]       匹配一个包括换行符、回车等在内的所有空白符
[:graph:]       匹配任何一个可以看得见的且可以打印的字符
[:xdigit:]      任何一个十六进制数(即:0-9,a-f,A-F)
[:cntrl:]       任何一个控制字符(ASCII字符集中的前32个字符)
[:print:]       任何一个可以打印的字符

实例

    [root@localhost tmp]# cat test
    hello world 
    HELLO everyone
    helLo everyone hello world
    HELLO EVERYONE HELLO WORLD
    #I LIKE EVERYTHING
  • 统计符合范本样式的列数
    [root@localhost tmp]# cat test | grep -c "hello"
    2
    
  • 统计时忽略字符大小写的差别
    [root@localhost tmp]# cat test | grep -i "hello"
    hello world 
    HELLO everyone
    helLo everyone hello world
    HELLO EVERYONE HELLO WORLD
    
  • 统计时显示行数
    [root@localhost tmp]# cat test | grep -n "hello"
    1:hello world 
    3:helLo everyone hello world
    
  • 反向统计,不包含统计字符的所有行
    [root@localhost tmp]#  cat test | grep -v "hello"
    HELLO everyone
    HELLO EVERYONE HELLO WORLD
    #I LIKE EVERYTHING
    
  • 统计以”hel”开通第四个字符是”l”或”L”的所有行
    [root@localhost tmp]#  cat test | grep "hel[lL]o"
    hello world 
    helLo everyone hello world
    
  • 统计以hello开头的所有行
    [root@localhost tmp]#  cat test | grep "^hello"
    hello world 
    
  • 统计开通不是“h”或“I”的所有行,注意[^list]list是字符集,不是world
    [root@localhost tmp]#  cat test | grep "^[^hI]"
    HELLO everyone
    HELLO EVERYONE HELLO WORLD
    
  • 统计以字符w开头,ld结尾,中间任意两个字符的所有行
    [root@localhost tmp]#  cat test | grep "w..ld"
    hello world 
    helLo everyone hello world
    
  • 统计以字符h开头,ld结尾,中间任意字符的所有行
    [root@localhost tmp]#  cat test | grep "h.*ld"
    hello world 
    helLo everyone hello world
    
  • 统计以匹配单词统计的所有行
    [root@localhost tmp]#  cat test | grep "\<hello\>"
    hello world 
    helLo everyone hello world
    
  • 统计“l”重复2次的所有行
    [root@localhost tmp]#  cat test | grep "l\{2\}"
    hello world 
    helLo everyone hello world
    
  • 统计“l”重复1或2次的所有行
    [root@localhost tmp]#  cat test | grep "l\{1,2\}"
    hello world 
    helLo everyone hello world
    
  • 统计“l”重复2次或2次以上以上的所有行
    [root@localhost tmp]#  cat test | grep "l\{2,\}"
    hello world 
    helLo everyone hello world
    
  • 统计显示空白行的行号
    [root@localhost tmp]#  cat test | grep -n "^$"
    6:
    7:
    8:
    9:
    
  • 统计空白行和注释行,带行号
    [root@localhost tmp]#  cat test | grep -nE "^$|#"
    5:#I LIKE EVERYTHING
    6:
    7:
    8:
    9:
    

综合实例

  • 复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。
    [root@localhost ~]# useradd tuser1;chmod -R go=--- /home/tuser1
    [root@localhost ~]# ll -a /home/tuser1
    总用量 12
    drwx------.  2 tuser1 tuser1  62 3月  22 10:05 .
    drwxr-xr-x. 10 root   root   124 3月  22 10:05 ..
    -rw-------.  1 tuser1 tuser1  18 8月   3 2016 .bash_logout
    -rw-------.  1 tuser1 tuser1 193 8月   3 2016 .bash_profile
    -rw-------.  1 tuser1 tuser1 231 8月   3 2016 .bashrc
    
  • 编辑/etc/group文件,添加组hadoop。
    [root@localhost ~]# let groupid=$( cat /etc/group | grep "\<hadoop\>" || cat /etc/group | tail -1 | cut -d: -f3 )+1 && echo "hadoop:x:$groupid" >>/etc/group && cat /etc/group | grep "\<hadoop\>"
    hadoop:x:1009
    
  • 手动编辑/etc/passwd文件新增一行,添加用户hadoop,其基本组ID为hadoop组的id号;其家目录为/home/hadoop
    #!/bin/bash
    #20180322 by eighteenxu
    
    
    uid=$(cat /etc/group | grep "\<hadoop\>" | cut -d: -f3)
    
    id $uid &> /dev/null
    
    if [ $? -eq 0 ];then
            echo "该ID用户已存在"
    else
            echo "hadoop:x:$uid:$uid::/home/hadoop:/bin/bash" >> /etc/passwd && cat /etc/passwd | grep "\<hadoop\>"
    fi
    
  • 复制/etc/skel目录为/home/hadoop,要求修改hadoop目录的属组和其它用户没有任何访问权限。
    修改/home/hadoop目录及其内部所有文件的属主为hadoop,属组为hadoop。

    #!/bin/bash
    #20180322 by eighteenxu
    
    
    #检查目录/home/hadoop是否存在,如果存在直接复制,不存在新建目录并复制
    cd /home/hadoop
    if [ $? -eq 0 ];then
            cp -R /etc/skel/. /home/hadoop
    else
            mkdir /home/hadoop && cp -R /etc/skel/. /home/hadoop
    fi
    
    #更改目录属住和属组,更改目录和子目录的权限
    chown -R hadoop:hadoop /home/hadoop && chmod -R go=--- /home/hadoop
    
    [root@localhost ~]# ll /home | grep hadoop  && ll -a /home/hadoop
    drwx------. 2 hadoop    hadoop    62 4月  11 2017 hadoop
    总用量 12
    drwx------. 2 hadoop hadoop  62 4月  11 2017 .
    drwxr-xr-x. 9 root   root   106 3月  22 14:13 ..
    -rw-------. 1 hadoop hadoop  18 3月  22 14:08 .bash_logout
    -rw-------. 1 hadoop hadoop 193 3月  22 14:08 .bash_profile
    -rw-------. 1 hadoop hadoop 231 3月  22 14:08 .bashrc
    
  • 显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;
    [root@localhost ~]# cat /proc/meminfo | grep "^[sS]"
    SwapCached:            0 kB
    SwapTotal:       2097148 kB
    SwapFree:        2097148 kB
    Shmem:              6868 kB
    Slab:              64376 kB
    SReclaimable:      28160 kB
    SUnreclaim:        36216 kB
    
  • 显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
    [root@localhost ~]# cat /etc/passwd | grep -v "/bin/nologin$" | cut -d: -f1
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    operator
    games
    ftp
    nobody
    systemd-bus-proxy
    systemd-network
    dbus
    polkitd
    tss
    postfix
    sshd
    chrony
    linux
    centos
    test
    tuser1
    hadoop
    
  • 显示/etc/passwd文件中其默认shell为/bin/bash的用户;
    [root@localhost ~]# cat /etc/passwd | grep "/bin/bash$" | cut -d: -f1
    root
    linux
    centos
    test
    tuser1
    hadoop
    
  • 找出/etc/passwd文件中的一位数或两位数;
    [root@localhost ~]# cat /etc/passwd | grep "\<[[:digit:]]\{1,2\}\>"
    root:x:0:0:root:/root:/bin/bash
    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
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    
  • 显示/boot/grub2/grub.cfg中以至少一个空白字符开头的行;
    [root@localhost ~]# cat /boot/grub2/grub.cfg | grep -E "^[[:space:]]+"
    
  • 显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
    [root@localhost ~]# cat /etc/rc.d/rc.sysinit | grep "^#[[:space:]][[:graph:]]"
    
  • 打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;
    [root@localhost ~]# 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     
    tcp6       0      0 :::22                   :::*                    LISTEN     
    tcp6       0      0 ::1:25                  :::*                    LISTEN    
    
  • 添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;
    [root@localhost ~]# useradd bash && useradd testbash && useradd basher && useradd nologin -s /sbin/nologin
    [root@localhost cript]# cat /etc/passwd | grep "\(\<[[:alnum:]]\+\>\).*\1$"
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    bash:x:1010:1010::/home/bash:/bin/bash
    nologin:x:1013:1013::/home/nologin:/sbin/nologin

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/92847

(0)
eighteenxueighteenxu
上一篇 2018-03-22
下一篇 2018-03-24

相关推荐

  • 纯文本配置还是注册表

    我们知道Unix/Linux下的程序配置文件从来都是纯文本的,你可以自由地修改和查看,他们也没有什么什么XML之类的玩意(参看XML的这两篇文章:一,二),这个最重要的Unix文化(参看Unix传奇下篇)40多年来就这么沿续下来了。我很佩服Microsoft的创新能力,一会儿用INI,一会儿用注册表,一会又是用XML,这就是Windows的编程中那“强大”的…

    Linux干货 2016-08-15
  • 第三次作业

    第三次作业 一、软链接与硬链接的区别    硬链接就是同一个文件使用了多个别名(他们有共同的 inode)。 硬链接可由命令 link 或 ln 创建,如: 1 2 #link oldfile newfile  #ln oldfile newfile   由于硬链接是有着相同 i…

    Linux干货 2016-08-03
  • 文本处理工具之grep正则表达式

    grep简介 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。 Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,…

    Linux干货 2016-08-08
  • Linux任务计划命令及应用

    at命令,crontab命令

    2018-03-12
  • Linux-Basic—shell如何解释命令的运行

    附件下载: Linux Basics-shell.pdf

    Linux干货 2016-11-21
  • linux计算机基础理论

    1. 计算机的组成及其功能 从基本结构上来讲,计算机可以分为五大部分: 运算器、存储器、控制器、输入设备、输出设备。 运算器的功能:实现算术运算和逻辑运算(与控制器组成CPU) 存储器功能:将输入设备接受到的信息以二进制的数据形式存到存储器中。 控制器的功能:将指令逐条从存储中取出,经译码分析后向全机发出相应的操作控制信号作用于其他部件,使各部件有条不紊地协…

    Linux干货 2018-03-04