正则表达式和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
相关推荐
Lary_Rock1 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
云飞云共享云桌面3 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮5 小时前
Linux 使用中的问题
linux·运维
dsywws6 小时前
Linux学习笔记之vim入门
linux·笔记·学习
幺零九零零7 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
小林熬夜学编程8 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
程思扬9 小时前
为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?
linux·服务器·网络·经验分享·后端·网络协议·1024程序员节
sun0077009 小时前
拷贝 cp -rdp 和 cp -a
linux·运维·服务器
wowocpp9 小时前
ubuntu 22.04 server 安装 anaconda3
linux·运维·ubuntu