【shell正则表达式-10】

本文详细介绍了grep命令的使用方法,包括grep、egrep和fgrep的区别,以及如何利用基本和扩展正则表达式进行精确文本搜索。通过实际案例,读者可以学习如何在Linux环境下高效查找文件内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:]]+'

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着蜗牛追汤圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值