简单好用的命令行神器:grep

工具利器 Sep 21, 2020

grep(Globally search a Regular Expression and Print):一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行(适用于 Linux、Mac 等系统);它简单、好用,很显格调;本文就分享下关于 grep 的使用技巧。

有必要进一步说明 grep 的功用;要知道在 lunix 系统中“一切皆文件”;假如你想知道,当前目录下的所有文件,包含“倾城”字串的文件有多少、目录在哪、在这个文件的哪一行?如何处理呢?用 grep 一行代码就能搞定:

grep -rne "倾城" .

关于 grep 的详细叙述,可以查看 grep 命令手册

如何使用

grep 的总体命令格式为:

grep [选项]  [模式]  [input_file_names]

具体命令和参数如下表格:

命令 参数 作用
-a -- 不要忽略二进制数据
-A <显示列数> 除了显示符合范本样式的那一行之外,并显示该行后的内容
-b -- 在显示符合范本样式的那一行之外,并显示该行之前的内容
-c -- 计算符合范本样式的列数
-C <显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容
-d <进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作
-e <范本样式> 指定字符串作为查找文件内容的范本样式
-E --- 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式
-f <范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式
-F --- 将范本样式视为固定字符串的列表
-G --- 将范本样式视为普通的表示法来使用
-h --- 在显示符合范本样式的那一列之前,不标示该列所属的文件名称
-H --- 在显示符合范本样式的那一列之前,标示该列的文件名称
-i -- 忽略字符大小写的差别
-l -- 列出文件内容符合指定的范本样式的文件名称
-L -- 列出文件内容不符合指定的范本样式的文件名称
-n -- 在显示符合范本样式的那一列之前,标示出该列的编号
-q -- 不显示任何信息
-R/-r -- 此参数的效果和指定“-d recurse”参数相同
-s -- 不显示错误信息
-v -- 反转查找
-w -- 只显示全字符合的列
-x -- 只显示全列符合的列
-y -- 此参数效果跟“-i”相同
-o -- 只输出文件中匹配到的部分

常见用法

文件字符串查找

  • 在文件中搜索一个单词,命令会返回一个包含 “match_pattern” 的文本行:
grep match_pattern file_name
grep "match_pattern" file_name
  • 在多个文件中查找:
grep "match_pattern" file_1 file_2 file_3 ...
  • 输出除之外的所有行 -v 选项:
grep -v "match_pattern" file_name
  • 标记匹配颜色 --color=auto 选项:

grep "match_pattern" file_name --color=auto

  • 使用正则表达式 -E 选项:
grep -E "[1-9]+"
或
egrep "[1-9]+"
  • 只输出文件中匹配到的部分 -o 选项:
echo this is a test line. | grep -o -E "[a-z]+\."
echo this is a test line. | egrep -o "[a-z]+\."
  • 统计文件或者文本中包含匹配字符串的行数 -c 选项:
grep -c "text" file_name
  • 输出包含匹配字符串的行数 -n 选项:
grep "text" -n file_name
或
cat file_name | grep "text" -n
#多个文件
grep "text" -n file_1 file_2
  • 打印样式匹配所位于的字符或字节偏移:
echo gun is not unix | grep -b -o "not"
#一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项 -b -o 一般总是配合使用。
  • 搜索多个文件并查找匹配文本在哪些文件中
grep -l "text" file_1 file_2 file_3

grep 递归搜索文件

  • 在多级目录中对文本进行递归搜索
grep "text" . -r -n
# .表示当前目录。

输出字符串匹配

ifconfig | grep "inet"

grep 逆向搜索

可以使用 grep 打印与特定字符模式不匹配的所有行。要反转搜索,加上 -v 参数就可以。

grep -v "倾城" .

列出匹配文件的名称

有时,您只需要查看包含单词或字符串的文件的名称,而排除实际的行。要仅打印与搜索匹配的文件名,加上 -l 参数就好:

grep -l "倾城" *

计算匹配成功的条数

grep 可以显示文件名和找到与单词匹配的行数。使用 -c 参数可计算匹配数

grep -c "倾城" .

使用 grep 匹配显示行号

当 grep 打印具有很多匹配项的结果时,可以很方便地查看行号。将 -n 参数附加到任何 grep命令以显示行号。

grep –n –C 2 "倾城" .

忽略 grep 搜索中的大小写

由于 grep 命令区分大小写,因此 -i 是grep搜索最有用的运算符之一。终端不仅显示小写结果,还显示大写和小写结果。输出包括带有混合大小写条目的行。

grep –i hello *

grep 静默输出

grep -q "倾城" *
#不会输出任何信息,如果命令运行成功返回 0,失败则返回非 0 值。一般用于条件测试。

打印出匹配文本之前或者之后的行

#显示匹配某个结果之后的3行,使用 -A 选项:
seq 10 | grep "5" -A 3

#显示匹配某个结果之前的3行,使用 -B 选项:
seq 10 | grep "5" -B 3

#显示匹配某个结果的前三行和后三行,使用 -C 选项:
seq 10 | grep "5" -C 3

#如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
echo -e "a\nb\nc\na\nb\nc" | grep a -A 1

在 grep 搜索结果中包括或者排除指定文件

#只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}

#在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"

#在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist

Tags

nicejade

轩帅,字琼璞,逍遥自在轩城主,晚晴幽草轩轩主,静轩之别苑阁主,悠然宜想亭主持。

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.