【shell正则表达式-10】

    技术2025-05-02  14

    1.grep/egrep/fgrep:

    grep:支持使用基本正则表达式。 egrep:支持使用扩展正则表达式。 fgrep:不支持使用正则表达式。 grep基本参数: -n 显示行号

    #显示文件行号 [root@node1 ~]# grep -n ".*" /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 2:bin:x:1:1:bin:/bin:/sbin/nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin 4:adm:x:3:4:adm:/var/adm:/sbin/nologin 5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6:sync:x:5:0:sync:/sbin:/bin/sync 7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8:halt:x:7:0:halt:/sbin:/sbin/halt 9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin 11:games:x:12:100:games:/usr/games:/sbin/nologin 12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin #显示包含root的行号 [root@node1 ~]# grep -n 'root' /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin

    -o 只显示匹配的内容 -q 静默模式,需要$?来显示上条命令是否执行成功 -v 取反 grep -v '#|^$' :去掉注释和空白行 -w 匹配单词 -i 忽略大小写 -e 等价于egrep,匹配多个 -A :如果匹配成功,则将匹配行及其后n行一起打印出来 -B :如果匹配成功,则将匹配行及其前n行一起打印出来 -C :如果匹配成功,则将匹配行及其前后n行一起打印出来

    [root@node1 ~]# ifconfig ens33 | grep "inet " -A 1 inet 192.168.131.108 netmask 255.255.255.0 broadcast 192.168.131.255 inet6 fe80::b6c0:3a78:4c0c:abf8 prefixlen 64 scopeid 0x20<link> [root@node1 ~]# ifconfig ens33 | grep "inet " -B 1 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.131.108 netmask 255.255.255.0 broadcast 192.168.131.255 [root@node1 ~]# ifconfig ens33 | grep "inet " -C 1 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.131.108 netmask 255.255.255.0 broadcast 192.168.131.255 inet6 fe80::b6c0:3a78:4c0c:abf8 prefixlen 64 scopeid 0x20<link>

    2.基本正则常用参数:

    ^从行首搜索,开头: grep ^root /etc/passwd $从行尾搜索,结尾:grep root$ /etc/passwd ^$空行 .单个字符:grep 'r..t' /etc/passwd *前面项任意次匹配,0,1,或多次 .*:匹配任意内容 []:匹配[]任意单个字符 [0-9]或[[:digit:]] [a-zA-Z]或[[:alpha:]] [[:upper:]] [[:lower:]] [[:alnum:]]字母和数字 [^]:匹配不在[]任意单个字符 \:转义 {}:匹配前项次数:使用基本正则要转义 \{n\}:匹配n次

    [root@node1 ~]# grep "ro\{2\}" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

    \{n,\}:匹配至少n次

    [root@node1 ~]# grep "ro\{1,\}" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin

    \{,m\}:匹配最多m次

    [root@node1 ~]# grep "ro\{,2\}" /etc/passwd root:x:0:0:root:/root:/bin/bash adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin

    \{n,m\}:匹配n到m次

    [root@node1 ~]# grep "ro\{1,2\}" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin

    \<:匹配单词的开头 \>:匹配单词的结尾

    [root@node1 ~]# grep "\<root" /etc/passwd root:x:0:0:root:/root:/bin/bash

    后项引用:后面例子中会用到。 分组:()得转义 \(\) \(ab\)* 后项引用 \1:引用第一个括号内容 \2:引用第二个括号内容

    #分组及后项引用 [root@node1 ~]# ifconfig ens33 | grep 'inet ' | sed -r 's/^.*et (.*) ne.*/\1/' 192.168.131.108 [root@node1 ~]# ifconfig ens33 | grep 'inet ' | sed -r 's/^.*cast (.*)/\1/' 192.168.131.255

    案列 1、显示/etc/passwd文件中以bash结尾的行;

    [root@node1 ~]# grep "bash$" /etc/passwd

    2、找出/etc/passwd文件中的三位或四位数;

    [root@node1 ~]# grep '[0-9]\{3,4\}' /etc/passwd [root@node1 ~]# egrep '[0-9]{3,4}' /etc/passwd

    3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行

    [root@node1 ~]# grep '^[[:space:]]\{1,\}[^[:space:]]' /etc/grub2.cfg

    4、找出"netstat -tan”命令的结果中,以‘LISTEN’后跟0或多个空白字符结尾的行;

    [root@node1 ~]# netstat -tan | grep 'LISTEN[[:space:]]*$'

    5、找出"fdisk -l“命令的结果中,包含以/dev/后跟sd或hd及一个字母的行;

    [root@node1 ~]# fdisk -l | grep "/dev/[s|d]d[[:alpha:]]"

    6、找出”ldd /usr/bin/cat“命令的结果中文件路径;

    [root@node1 ~]# ldd /usr/bin/cat | egrep -o '/.*/'

    7、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少用三种方式实现;

    [root@node1 ~]# grep -i '^s' /proc/cpuinfo stepping : 9 siblings : 1 [root@node1 ~]# grep '^[s|S]' /proc/cpuinfo stepping : 9 siblings : 1 [root@node1 ~]# egrep "^(s|S)" /proc/cpuinfo stepping : 9 siblings : 1

    8、显示当前系统上root、centos或spark用户的相关信息;

    [root@node1 ~]# egrep "root|centos|spark" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin centos:x:1000:1000::/home/centos:/bin/bash [root@node1 ~]# grep -E "root|centos|spark" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin centos:x:1000:1000::/home/centos:/bin/bash

    9、echo输出一个绝对路径,使用egrep取出其基名;

    [root@node1 ~]# basename /etc/passwd passwd [root@node1 ~]# dirname /etc/passwd /etc [root@www day7]# dir=/etc/rc.d/init.d/functions [root@www day7]# echo ${dir##/*/} functions [root@www day7]# echo ${dir%/*} /etc/rc.d/init.d

    10、找出ifconfig命令结果中的1-255之间的整数;

    [root@node1 ~]# ifconfig | egrep -o -w "[1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]"

    11、找出系统中其用户名与shell名相同的用户。

    [root@node1 ~]# grep '^\(.*\):.*\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

    注:

    #sort默认以字符串升序排序,若想要数字排序加-n [root@node1 ~]# grep "bash$" /etc/passwd | sort -t : -n -k 3 | head -1 | cut -d : -f 1 root #空格字符用[[:space:]]表示 [root@node1 ~]# grep "^#[[:space:]]\{1,\}[^[:space:]].*" /etc/inittab [root@node1 ~]# grep '[0-9]\{1,2\}' /proc/cpuinfo

    3.扩展正则常用参数:{}与()不用转义

    ?:0次到1次,等价于{,1}或{0,1} +:1次到多次,等价于{1,} s|t:匹配s或t ():把括号内容单项处理 {n,m}:匹配n,m次

    grep "\<48\>" 或 grep -w "48" egrep "483|484" 或 grep "48[3|4]" 或 egrep 48"(3|4)" egrep "^(4|8)" 或 grep "^[48]" 不是4/8开头的grep "^[^48]"或 grep -v "^[48]"

    注:用正则表达式匹配邮件地址和网站 egrep '[[:alpha:]][a-zA-z_0-9]+@[[:alpha:]]+.[[:aplpa:]]+'

    Processed: 0.015, SQL: 9