9.1 正则介绍_grep上
9.2 grep中
9.3 grep下
9.1正则
正则就是带有特殊符号的字符串 其中特殊符号代表某些含义,各种编程语言和shell脚本中都经常运用
符号 | 意思 |
---|---|
[] | 表示字符中的一个 |
^ | 表示开头 在中括号里表示非 |
& | 表示行尾 |
. | 表示任意一个字符 |
* | 表示前一个字符出现0次或者多次 |
+ | 表示前一个字符出现1次或者多次 grep需转义 |
? | 表示前一个字符出现0次或者1次 grep需转义 |
.* | 表示任意字符 |
\ | 表示转义 |
{} | 表示范围 出现次数 grep需转义 |
() | 表示整体 grep需转义 |
| | 表示或者 grep需转义 |
9.2/9.3grep/egrep命令
grep:文本搜索工具 过滤指定关键词
用法:grep [-cinvrABC] 'word' 文件名
-n
:显示行号1
2
3[root@localhost test]# grep -n 'root' 1.txt ##过滤带root的行和显示行号
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
-c
:合计总行数1
2[root@localhost test]# grep -c 'root' 1.txt ##合计出带root的行数
2
-i
:不区分大小写1
2
3[root@localhost test]# grep -i 'root' 1.txt ##不区分关键词大小写来过滤带root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
-v
:取反查找1
2
3
4
5
6
7[root@localhost test]# grep -v 'sbin' 1.txt ##过滤出不带有sbin行
root:x:0:0:root:/root:/bin/bash
kun1:x:8888:1001::/home/kun1/:/bin/bash
kun2:x:1001:1001::/home/kun2:/bin/bash
kun05:x:1390:1390::/home/kun05:/bin/bash
111:x:8889:8889::/home/111:/bin/bash
kun3:x:8890:8890::/home/kun3:/bin/bash
-r
:遍历所有子目录来过滤1
[root@localhost test]# grep -r 'sbin' /etc/ ##遍历etc目录下的所有文件和目录来过滤出带有sbin的行
-An(n为数字)
:过滤出符合要求的行和下面n行1
2
3
4[root@localhost test]# grep -nA2 'root' 1.txt ##过滤出带root的行和下面2行
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
-Bn(n为数字)
:过滤出符合要求的行和上面n行1
2
3
4[root@localhost test]# grep -nB2 'ROOT' 1.txt ##过滤出带ROOT的行和上面2行
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
-Cn(n为数字)
:过滤出符合要求的行和上下面各n行1
2
3
4
5
6[root@localhost test]# grep -nC2 'ROOT' 1.txt ##过滤出带ROOT的行和上面下面各2行
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
-E
:等同使用egrep命令1
2
3
4
5[root@localhost test]# grep -E 'o{2}' 1.txt ##等于egrp 其中{}在egrep中不需要转义
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
grep中正则用法
grep ‘[0-9]’ /etc/inittab 过滤出带数字的行
1 | [root@localhost test]# grep '[0-9]' /etc/inittab |
grep -v ‘[0-9]’ /etc/inittab 过滤出不带数字的行
1 | [root@localhost test]# grep -v '[0-9]' /etc/inittab |
grep -vn ‘^#’ 2.txt 过滤出开头不带#的行
1 | [root@localhost test]# grep -vn '^#' 2.txt |
1 | [root@localhost test]# grep '^#' 2.txt |grep -v '^#$' 先过滤出开头是#的行再过滤出不是开头为#的空行的行 |
grep ‘^[^a-zA-Z]’ 2.txt 过滤出开头为非字母的行
1 | [root@localhost test]# grep '^[^a-zA-Z]' 2.txt |
grep ‘r.o’ 1.txt 过滤出有ro之间有任意一个字符的行
1 | [root@localhost test]# grep 'r.o' 1.txt |
grep ‘r*o’ 1.txt 过滤出有ro之间有0个或者多个r的行 即 o ro rro ….
1 | [root@localhost test]# grep 'r*o' 1.txt |
grep ‘.*‘ 1.txt 过滤出任意字符 .*表示任意字符
1 | [root@localhost test]# grep 'roo.*bash' 1.txt ##过滤出roo和bash之前任意字符的行 |
grep ‘o{2}‘ 1.txt 过滤出o出现2次的行 {2}表示出现2次 grep中需要转义
1 | [root@localhost test]# grep 'o\{2\}' 1.txt |
1 | [root@localhost test]# egrep 'o{2}' 1.txt 同上面一样 egrep不需要转义 |
egrep ‘(oo){1}’ 1.txt 过滤出oo出现1次的行
1 | [root@localhost test]# egrep '(oo){1}' 1.txt |
egrep ‘o+o’ 1.txt 过滤出有oo之间有1个或者多个o的行 即oo ooo ….
1 | [root@localhost test]# egrep 'o+o' 1.txt |
egrep ‘r?o’ 1.txt 过滤出有ro之间有0个或者1个r的行 即o或者ro
1 | [root@localhost test]# egrep 'r?o' 1.txt |
egrep ‘root|sbin’ 1.txt 过滤出带有root或者sbin的行
1 | [root@localhost test]# egrep 'root|sbin' 1.txt |
基本正则表达式与扩展正则表达式
grep、egrep支持正则表达式,但fgrep完全不支持正则表达式
命令 | 是否支持正则 | 是否支持扩展正则 |
---|---|---|
grep | 是 | 否 |
egrep/grep -E | 是 | 是 |
fgrep/grep -F | 否 | 否 |
在基本正则表达式中,只承认 “^
“、”$
“、”.
“、”*
“、”[
“、”]
“六个元字符,扩展正则表达式中,在正则表达式基础上,增加”(
“、”)
“、”{
“、”}
“、”?
“、”+
“、”|
“七个元字符
注意
:grep命令、sed命令在使用基本正则表达式模式时,字符”(
“、”)
“、”{
“、”}
“ 需要加上反斜杠才被当做元字符处理,否则当做普通字符处理,但在使用扩张正则表达式模式时(grep -E
、sed -r
),任何元字符前加上反斜杠会被当做普通字符处理。
1 | $ grep '\[test\]' file.txt # 在匹配[test] |