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

相关推荐

  • 管理用户和组。

    用户的概念        对于计算机的应用,我们大多数都是在储存资料、办公娱乐。我们耗费精力与时间把我们喜欢的一些东西寻找下载在我们的计算机中,这台计算机没有一丁点限制,谁都可以进行访问,那我们所进行存储的一些东西就将变得很不安全,但是我们在给计算机创建一个用户并设置密码之后,其他人没获得…

    Linux干货 2016-10-23
  • RedHat系列linux网络属性配置

    一、Linux网络管理基础 1 路由条目:  目标地址 经下一跳(nexthop) 目标地址的类别: 单个主机: 主机路由 网路接口: 网络路由 目标地址为0.0.0.0/0.0.0.0: 默认路由 2 将linux主机接入到网络中: IP/NETMASK: 本地通信 路由(网关): 酷网络通信 DNS服务器地址: 基于主机名的通信 主dns服务器…

    Linux干货 2016-09-19
  • 【原创】RHEL7-PPTP-VPN-Server排错

    第一次写博客,明显不知道如何下笔。     昨天6月21日,突然发现往日运行一切正常的pptpvpn服务器怎么也连不上了,错误代码是619。这个错误代码以前并没有见过,于是上google查了一下资料,据说有几种可能: 1,路由器或防火墙干掉了tcp1723; 2,电脑协议栈问题; 3,拨号连接的认证选项有问题; &nb…

    Linux干货 2016-06-23
  • LINUX集群概念

    反向代理服务器:客户端发现请求给反向代理服务器,反向代理服务器与后端真实服务器进行通信,并由反向代理服务器返回信息给客户端 不同的服务,反向代理服务器使用的协议不同(如http、mysql等): 反代服务器后端的真实服务器一般是多台服务器组成的集群 Linux Cluster:          集群:将多台…

    Linux干货 2017-01-10
  • 使用NFS和Samba文件服务搭建博客站点

    使用NFS和Samba文件服务搭建博客站点 实验目的:分别使用NFS和Smaba文件服务实现wordpress 实验要求: (1) server导出/data/application/web,在目录中提供wordpress; (2) client挂载nfs server导出的文件系统至/var/www/html;(3) 客户端1(lamp),部署w…

    2017-04-30