正则表达式和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
相关推荐
长弓聊编程10 分钟前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
cherub.17 分钟前
深入解析信号量:定义与环形队列生产消费模型剖析
linux·c++
梅见十柒40 分钟前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
Koi慢热43 分钟前
路由基础(全)
linux·网络·网络协议·安全
传而习乎1 小时前
Linux:CentOS 7 解压 7zip 压缩的文件
linux·运维·centos
我们的五年1 小时前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
zwjapple1 小时前
typescript里面正则的使用
开发语言·javascript·正则表达式
IT果果日记1 小时前
ubuntu 安装 conda
linux·ubuntu·conda
Python私教1 小时前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
羑悻的小杀马特2 小时前
环境变量简介
linux