grep 命令的常用技巧

如果在 公众号 文章发现状态为 已更新, 建议点击 查看原文 查看最新内容。

状态: 未更新

原文链接: https://typonotes.com/posts/2023/03/27/linux-command-grep/

在Linux和Unix操作系统中,grep是一种在文本文件中搜索字符串的命令行工具。以下是grep命令的一些常用技巧:

  1. 基本用法:在命令行中输入 grep 关键词 文件名 即可搜索包含该关键词的行。例如:
grep hello myfile.txt
  1. 忽略大小写:使用 -i 选项可以忽略大小写,这样搜索时不区分大小写。例如:
grep -i hello myfile.txt
  1. 显示行号:使用 -n 选项可以显示匹配行的行号。例如:
grep -n hello myfile.txt
  1. 显示匹配行之前/之后的行数:使用 -A-B 选项可以分别显示匹配行之后和匹配行之前的指定行数。例如:
grep -A 2 hello myfile.txt
grep -B 1 hello myfile.txt
  1. 显示匹配行周围的行数:使用 -C 选项可以同时显示匹配行之前和之后的指定行数。例如:
grep -C 1 hello myfile.txt
  1. 排除匹配的行:使用 -v 选项可以排除匹配的行。例如:
grep -v hello myfile.txt
  1. 限制边界搜索:使用 -w 选项可以限制搜索的单词边界。例如:
grep -w hello myfile.txt

在这个例子中,如果我们使用 grep hello myfile.txt ,那么搜索结果将包含包含 hello 子字符串的行,例如 hello worldhelloworld 等。但是,如果我们使用 grep -w hello myfile.txt ,那么搜索结果将仅包含包含单词 hello 的行,例如 hello world ,而不包括 helloworld

grep 使用 Perl 正则表达式

使用 -P 选项可以让grep使用Perl正则表达式而不是基本的正则表达式。Perl正则表达式更强大,可以支持更多的特性,例如非贪婪匹配和后向引用。例如:

grep -P '\d{3}-\d{2}-\d{4}' myfile.txt

这个例子使用了Perl正则表达式,在文本文件中搜索包含美国社会保险号码的行。正则表达式 \d{3}-\d{2}-\d{4} 表示一个三位数,一个短横线,两个两位数和一个短横线,组成了一个美国社会保险号码的格式。

以下是一些常用的Perl正则表达式案例:

  • 匹配任何字符:.(句点)代表任何字符。例如,grep -P 'a.c' myfile.txt 将匹配任何包含"a"、“c"之间任意一个字符的行。
  • 匹配数字:\d代表任何数字字符。例如,grep -P '\d+' myfile.txt 将匹配任何包含一个或多个数字的行。
  • 匹配字母:\w代表任何字母字符(包括数字和下划线)。例如,grep -P '\w+' myfile.txt 将匹配任何包含一个或多个字母字符的行。
  • 匹配空白字符:\s代表任何空格字符(包括空格、制表符和换行符)。例如,grep -P '\s+' myfile.txt将匹配任何包含一个或多个空格字符的行。
  • 匹配行首和行尾:^代表行首,$代表行尾。例如,grep -P '^hello' myfile.txt将匹配任何以"hello"开头的行,而grep -P 'world$' myfile.txt将匹配任何以"world"结尾的行。
  • 匹配重复字符:+代表一个或多个重复字符,``代表零个或多个重复字符,?代表零个或一个重复字符。例如,grep -P 'bo+s' myfile.txt将匹配任何包含"bos”、“boos”、“boooos"等的行,而grep -P 'colou?r' myfile.txt将匹配任何包含"color"或"colour"的行。
  • 匹配字符集合:[]代表一个字符集合。例如,grep -P '[aeiou]' myfile.txt将匹配任何包含元音字母的行,而grep -P '[^aeiou]' myfile.txt将匹配任何不包含元音字母的行。
  • 匹配特定次数的字符:{n}表示匹配n个重复字符,{n,}表示匹配n个或更多重复字符,{n,m}表示匹配n到m个重复字符。例如,grep -P 'o{2}' myfile.txt将匹配任何包含两个连续的"o"的行,而grep -P 'o{2,}' myfile.txt将匹配任何包含两个或更多连续的"o"的行。

匹配字母:\w代表任何字母字符(

Grep 使用 Perl 正则表达式案例:

  • 匹配任何字符:.(句点)代表任何字符。例如,grep -P 'a.c' myfile.txt 将匹配任何包含"a”、“c"之间任意一个字符的行。
  • 匹配数字:\d代表任何数字字符。例如,grep -P '\d+' myfile.txt 将匹配任何包含一个或多个数字的行。
  • 匹配字母:\w代表任何字母字符(包括数字和下划线)。例如,grep -P '\w+' myfile.txt 将匹配任何包含一个或多个字母字符的行。
  • 匹配空白字符:\s代表任何空格字符(包括空格、制表符和换行符)。例如,grep -P '\s+' myfile.txt将匹配任何包含一个或多个空格字符的行。
  • 匹配行首和行尾:^代表行首,$代表行尾。例如,grep -P '^hello' myfile.txt将匹配任何以"hello"开头的行,而grep -P 'world$' myfile.txt将匹配任何以"world"结尾的行。
  • 匹配重复字符:+代表一个或多个重复字符,``代表零个或多个重复字符,?代表零个或一个重复字符。例如,grep -P 'bo+s' myfile.txt将匹配任何包含"bos”、“boos”、“boooos"等的行,而grep -P 'colou?r' myfile.txt将匹配任何包含"color"或"colour"的行。
  • 匹配字符集合:[]代表一个字符集合。例如,grep -P '[aeiou]' myfile.txt将匹配任何包含元音字母的行,而grep -P '[^aeiou]' myfile.txt将匹配任何不包含元音字母的行。
  • 匹配特定次数的字符:{n}表示匹配n个重复字符,{n,}表示匹配n个或更多重复字符,{n,m}表示匹配n到m个重复字符。例如,grep -P 'o{2}' myfile.txt将匹配任何包含两个连续的"o"的行,而grep -P 'o{2,}' myfile.txt将匹配任何包含两个或更多连续的"o"的行。

grep 在 shell 中的条件判断

grep 的搜索结果, 找到就是 成功 , 没找到就是 失败, 因此可以直接使用其作为条件语句。

通常, 在使用 if 条件判断的时候, 会使用变量 $RET 捕捉执行结果, 并对 $RET 的值进行判断。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash
grep abc 111.txt > /dev/null
RET=$?

if [[ $RET == 0 ]]; then
    {
        echo "found"
    }
else
    {
        echo "not found"
    }
fi

bash 中, 可以直接使用 逻辑 表达式, 整个结构看起来更简单。

1
2
3
4
5
6
#!/bin/bash
grep abc 111.txt > /dev/null && {
	echo "found"
} || {
	echo "not found"
}