正则表达式和grep命令

1.概念:

  • 正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串

  • 在Shell命令行中,用户可以使用grep命令来测试

    参数 说明
    -b 在输出的每一行显示包含匹配字符串的行在文件中的字节偏移量
    -c 仅显示找到的行数
    -i 显示找到的行,比较时不区分大小写
    -h 在查找多个文件时,指示grep不要将文件名加入到输出之前
    -l 显示首次匹配串所在的文件名并用换行符将其隔开。当在某文件中多次出现匹配串时,不重复显示此文件名
    -n 显示找到的行,显示行号(文件首行行号为1)
    -o 只显示匹配的内容
    -A 如果匹配成功,则将匹配行及其后n行一起打印出来
    -B 如果匹配成功,则将匹配行及其前n行一起打印出来
    -C 如果匹配成功,则将匹配行及其前后n行一起打印出来
    -E 等于egrep,扩展
    --color 高亮颜色显示匹配到的字符串
    -v 显示没有匹配字符串的行
    -w 匹配单词
    -x 只显示整行严格匹配的行
    -P 匹配指定字符串之间的字符
    • grep:支持使用基本正则表达式(注意:grep要将{}转义,{},egrep不需要转义)

      复制代码
      grep ^SELINUX /etc/selinux/config    # 查找以SELINUX开头的行数据
    • egrep:支持使用扩展正则表达式

    • fgrep:不支持使用正则表达式

2.基本正则表达式:

  • 基本正则表达式(Basic Regular Expression,BRE),又称为标准正则表达式

  • 字符:

    字符 说明 字符 说明
    ^word 在每行的开始进行匹配 str 对str中的任何单个字符进行匹配
    word$ 在每行的末尾进行匹配 \^str 对任何不在str中的单个字符进行匹配
    . 对任何单个字符进行匹配 a-b 对a到b之间的任何字符进行匹配
    * 对前一项进行0次或多次重复匹配 \ 忽略后面一个字符的特殊含义
    \b 其后面的任意字符必须作为单词首部或尾部出现 {n,m} 匹配n到m次,前一个字符
    .* 匹配所有的字符,0次到多次 {n,} 至少N次,多了不限
    ^.* 任意多个字符开头 {n} n次
    ^$ 表示空行,不是空格 {,m} 至多m次,少了不限
    \ <word 其后面的任意字符必须作为单词首部出现 word> 其前面的任意字符必须作为单词尾部出现
    \w 匹配包括下划线的任何单词字符
    \W 匹配任何非单词字符。等价于"A-Za-z0-9_"
    \d 匹配一个数字字符
    \D 匹配一个非数字字符。等价于0-9。
    \s 空白符
    \S 非空白符
    复制代码
    [root@quruixiang shellstudy]# echo "1234578125" |grep '5$'
    1234578125
    
    [root@quruixiang shellstudy]# echo "1234578125" |grep '12.'
    1234578125
    
    [root@quruixiang shellstudy]# echo "1234578125" |grep '1*'
    1234578125
    
    [root@quruixiang shellstudy]# echo "123asdfegv123" |grep [ab]
    123asdfegv123
    
    [root@quruixiang shellstudy]# echo "123asdfegv123" |grep [a-zA-Z]
    123asdfegv123
    
    [root@quruixiang shellstudy]# echo "3.1415926" |grep '1\{1,\}'     # grep命令使用{}需要转义
    3.1415926
    
    [root@quruixiang shellstudy]# echo "abcdefg" | grep '\babc'
    abcdefg
    
    [root@quruixiang shellstudy]# grep "bash\>" /etc/passwd
    
    # 5、查找/etc/inittab中含有"以s开头,并以d结尾的单词"模式的行;
    [root@quruixiang shellstudy]# grep "\<s[a-z]*d\>" /etc/inittab
  • 正则表达式字符集:(grep得+参数E)

    字符 说明
    \[:alnum:] 匹配任意一个字母或者数字,等价于A-Za-z0-9
    \[:alpha:] 匹配任意一个字母,等价于A-Za-z
    \[:digit:] 匹配任意一个数字,等价于0-9
    \[:lower:] 匹配任意一个小写字母,等价于a-z
    \[:upper:] 匹配任意一个大写字母,等价于A-Z
    \[:space:] 匹配任意一个空白符,包括空格、制表符、换行符以及分页符
    \[:blank:] 匹配空格和制表符
    \[:graph:] 匹配任意一个看得见的可打印字符,不包括空白字符
    \[:print:] 匹配任何一个可以打印的字符,包括空白字符,但是不包括控制字符、字符串结束符'\0'、EOF文件结束符(-1)
    \[:cntrl:] 匹配任何一个控制字符,即ASCII字符集中的前32个字符。例如换行符、制表符等
    \[:punct:] 匹配任何一个标点符号,例如"\[\]"、"{}"或者","等
    \[:xdigit:] 匹配十六进制数字,即0-9、a-f以及A-F

3.扩展正则表达式:

  • 扩展正则表达式(Extended Regular Expression,ERE)支持比基本正则表达式更多的元字符,但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持

  • 字符:

    字符 说明 字符 说明
    + 对前一项进行1次或多次重复匹配 {j} 对前一项进行j次重复匹配
    ? 对前一项进行0次或1次重复匹配 {j,} 对前一项进行j次或更多次重复匹配
    (?=exp) 断言自身出现的位置的后面能匹配表达式exp {,k} 对前一项最多进行k次重复匹配
    (s|t) 匹配s项或t项中的一项
    ( ) 将括号里的内容看成一个整体 (word).\1 定义子表达式的开始和结束位置(字符串开始和结尾)
    复制代码
    [root@quruixiang shellstudy]# grep -E "^(s|S)" /proc/meminfo
    
    # 8、显示当前系统上root、centos或spark用户的相关信息;
    [root@quruixiang shellstudy]# grep -E -w "^(root|centos|spark)" /etc/passwd    # -w匹配单词
    # 匹配数据库列表中没有Database或者information_schema的数据库
    mysql -h127.0.0.1 -uroot -p110119 -e "show databases;" | grep -Ev "Database|information_schema"
    
    # 4、查找/etc/rc.d/rc.local中包含"以to开始并以to结尾"的字串行;
    [root@quruixiang shellstudy]# grep -E -w "(to).*\1" /etc/rc.d/rc.local    # \1表示引用to
    
    [root@quruixiang ~]# echo "window10" | grep -P "window(?=10)"
    window10

4.练习:

复制代码
# 1、显示/etc/passwd文件中以bash结尾的行;
[root@quruixiang shellstudy]# grep "bash\>" /etc/passwd
​
# 2、找出/etc/passwd文件中的三位或四位数;
[root@quruixiang shellstudy]# grep "[0-9]\{3,4\}" /etc/passwd
​
# 3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行;
[root@quruixiang shellstudy]# grep -E "^[[:space:]].*" /etc/grub2.cfg
​
# 4、找出"netstat -tan"命令的结果中,以'LISTEN'后跟0个或多个空白字符结尾的行;;
[root@quruixiang shellstudy]# netstat -tan | grep -E "LISTEN[[:space:]]*\>"
​
# 5、找出"fdisk -l"命令的结果中,包含以/dev/后跟sd或hd及一个字母的行;
[root@quruixiang shellstudy]# fdisk -l | grep "/dev/[sh]d[a-z]"
​
# 6、找出"ldd /usr/bin/cat"命令的结果中文件路径;
[root@quruixiang shellstudy]# ldd /usr/bin/cat | grep -o "/[^[:space:]]\{1,\}"       # -o只显示匹配到的内容
​
# 7、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少用三种方式实现;
[root@quruixiang shellstudy]# grep "^[Ss]" /proc/meminfo
[root@quruixiang shellstudy]# grep -i "^s" /proc/meminfo        # -i忽略大小写
[root@quruixiang shellstudy]# grep -E "^(s|S)" /proc/meminfo
​
# 8、显示当前系统上root、centos或spark用户的相关信息;
[root@quruixiang shellstudy]# grep -E -w "^(root|centos|spark)" /etc/passwd    # -w匹配单词
​
# 9、echo输出一个绝对路径,使用egrep取出其基名;
[root@quruixiang shellstudy]# echo /usr/shellstudy/ | grep -E -o "[^/]+/?$" | cut -d "/" -f 1
# 10、找出ifconfig命令结果中的1-255之间的整数;
[root@quruixiang shellstudy]# ifconfig | grep -E -o "([1-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-5])"
​
# 11、找出系统中其用户名与shell名相同的用户。
[root@localhost ~]# grep "^\(.*\):.*\1$" passwd

# 1、显示/etc/rc.d/rc.sysinit文件中以不区分大小的h开头的行;
[root@quruixiang shellstudy]# grep -i h /etc/rc.d/rc.sysinit
​
# 2、显示/etc/passwd中以sh结尾的行;
[root@quruixiang shellstudy]# grep "sh$" /etc/passwd
​
# 3、显示/etc/fstab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
[root@quruixiang shellstudy]# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/fstab
​
# 4、查找/etc/rc.d/rc.local中包含"以to开始并以to结尾"的字串行;
[root@quruixiang shellstudy]# grep -E -w "(to).*\1" /etc/rc.d/rc.local
​
# 5、查找/etc/inittab中含有"以s开头,并以d结尾的单词"模式的行;
[root@quruixiang shellstudy]# grep "\<s[a-z]*d\>" /etc/inittab
​
# 6、查找ifconfig命令结果中的1-255之间的整数;
[root@quruixiang shellstudy]# ifconfig | grep -E -o "([1-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-5])"
​
# 7、显示/var/log/secure文件中包含"Failed"或"FAILED"的行;
[root@quruixiang shellstudy]# grep -E -w "(failed|FAILED)" /var/log/secure
​
# 8、在/etc/passwd中取出默认shell为bash的行;
[root@quruixiang shellstudy]# grep "bash$" /etc/passwd
​
# 9、以长格式列出/etc/目录下以ns开头、.conf结尾的文件信息;
[root@quruixiang shellstudy]# ls /etc | grep "ns[a-zA-Z0-9_]\{1,\}.conf$"
# 10、高亮显示passwd文件中冒号,及其两侧的字符;
[root@quruixiang shellstudy]# grep --color ".:." /etc/passwd
相关推荐
2035去旅行2 小时前
bootcmd 详细讲解
linux·嵌入式·arm·soc
陈希1233 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
女神下凡3 小时前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
且从容.7 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道7 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
且从容.10 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落12 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨12 小时前
WSL2的安装与使用
linux·wsl
微小的鱼12 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng12 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器