正则三剑客 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
posted @ 2021-04-28 18:36  必安  阅读(110)  评论(0)    收藏  举报