# grep 和 egrep

# 定义

相当于一个过滤器,grep 和 egrep 总体来说都是实现了文本的过滤。egrep 的 e 相当于是 extend 扩展。egrep 多了一些扩展正则表达式的选项。用得最多的还是 grep。

# 语法格式

  • 过滤查找是以行为单位的

  • option 是可选项,pattern 是必选项

  • 如果是一个目录那么必须加 -r 递归搜索才能进行

  • 扩展正则表达式和基本正则表达式是两个概念,并不是说 grep 就不能使用正则表达式了

# 第一种语法格式

grep [option][pattern][file1,file2]

# 第二种语法格式

command | grep [option][pattern]

cat /etc/passwd | grep -n "doc.*"
  • 必须掌握的选项:

    选项 含义
    -v 显示不匹配 pattern 的行
    -i 搜索时忽略大小写
    -n 显示行号
    -E 支持扩展的正则表达式
    -F 不支持正则表达式,按字符串的字面意思进行匹配
    -r 递归搜索
  • 需了解的选项:

    选项 含义
    -c 只输出匹配行的数量,不显示具体内容
    -w 匹配整词
    -x 匹配整行
    -l 只列出匹配的文件名,不显示具体匹配行内容
  • grep -v "^$"表示忽略空行

# 查找etc中passwd文件中含有doc字符串的行并显示行号
grep -n doc /etc/passwd

# 查找当前目录下docs文件下所有文件含有doc字符串的忽律大小写的内容行并显示行号
grep -rni doc docs

# 查找当前目录下扩展正则表达式匹配python或PYTHON的行
grep -E "python|PYTHON" file

# 查找etc目录下含有.*:字符串的行(.*不表示正则了)
grep -rnF ".*:" /etc

# 查找当前目录下package.json 和 .gitignore文件中含有doc的行以及行号
grep -n "doc" package.json .gitignore

# 显示当前目录docs文件下文件中匹配"do.*"的总行数
grep -cr "do.*" docs

# cat /etc/passwd 内容之后在其中找满足"doc.*"的
cat /etc/passwd | grep -n "doc.*"

# grep 和 egrep:

  • grep 默认不支持扩展正则表达式,只支持基础正则表达式

  • 使用 grep -E 可以支持扩展正则表达式

  • 使用 egrep 可以支持扩展正则表达式,与 grep -E 等价

grep -E "python|PYTHON" file

# 等价

egrep "python|PYTHON" file