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