正则三剑客 grep
grep
- grep [-cinvABC] 'word' filename
- -c 行数
- -i 不区分大小写
- -n 显示行号
- -v 取反
- -r 遍历所有子目录
- -A 后面跟数字,过滤出符合要求的行以及下面n行
- -B 同上,过滤出符合要求的行以及上面n行
- -C 同上,同时过滤出符合要求的行以及上下各n行
将/etc/passwd,有出现 root 的行取出来,同时显示这些行在/etc/passwd的行号
- grep -n 'root' /etc/passwd
过滤不带有某个关键词的行,并输出行号
- grep -nv 'nologin' /etc/passwd
过滤出所有包含数字的行
- grep '[0-9]'/etc/inittab
过滤出所有不包含数字的行
- grep -v '[0-9]'/etc/inittab
把所有以 '#' 开头的行去除
- grep -v '^#' /etc/inittab
去除所有空行和以 '#' 开头的行
- grep -v '^#' /etc/inittab|grep -v '^$'
在正则表达式中, "^" 表示行的开始, "$" 表示行的结尾,那么空行则可以用 "^$" 表示,如何打印出不以英文字母开头的行呢?
[root@localhost ~]# vim test.txt
[root@localhost ~]# cat test.txt
123
Abc
456
abc2323
#laksdjf
Alllllllll
- grep '^[^a-zA-Z]' test.txt //过滤出所有不以字母开头的行
123
456
#laksdjf
[root@localhost ~]# grep '[^a-zA-Z]' test.txt //过滤出所有以字母开头
123
456
abc2323
#laksdjf
如果是数字的话就用[0-9]这样的形式,当然有时候也可以用这样的形式[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写字母则要这样写[0-9a-zA-Z]。另外[ ]还有一种形式,就是[^字符] 表示除[ ]内的字符之外的字符。
过滤出r和o之间有任意一个字符的行
- grep 'r.o' test.txt
过滤出前面至少有一个o字符的行
- grep 'oo*' test.txt
过滤出包含任意字符的行
- grep '.*' test.txt
'.*' 表示零个或多个任意字符,空行也包含在内。
指定要过滤出的字符出现的次数
- grep 'o\{2\}' /etc/passwd
指定要过滤字符出现的次数
- egrep 'o{2}' /etc/passwd
这里用到了{ },其内部为数字,表示前面的字符要重复的次数。上例中表示包含有两个o 即 'oo' 的行。注意,{ }左右都需要加上脱意字符 '\', 另外,使用{ }我们还可以表示一个范围的,具体格式是 '{n1,n2}' 其中n1<n2,表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。
筛选一个或多个指定的字符
- egrep 'o+' /etc/passwd
过滤出零个或一个指定的字符(n-1或n个)
- egrep 'o?' /etc/passwd
筛选字符串1或者字符串2
- egrep 'root|nologin' /etc/passwd
用( )表示一个整体,例如(oo)+就表示1个 'oo' 或者多个 'oo'
- egrep '(oo){2}' /etc/passwd

浙公网安备 33010602011771号