状态: 未更新
原文链接: https://typonotes.com/posts/2023/03/27/linux-command-grep/
在Linux和Unix操作系统中,grep是一种在文本文件中搜索字符串的命令行工具。以下是grep命令的一些常用技巧:
- 基本用法:在命令行中输入
grep 关键词 文件名
即可搜索包含该关键词的行。例如:
grep hello myfile.txt
- 忽略大小写:使用
-i
选项可以忽略大小写,这样搜索时不区分大小写。例如:
grep -i hello myfile.txt
- 显示行号:使用
-n
选项可以显示匹配行的行号。例如:
grep -n hello myfile.txt
- 显示匹配行之前/之后的行数:使用
-A
和-B
选项可以分别显示匹配行之后和匹配行之前的指定行数。例如:
grep -A 2 hello myfile.txt
grep -B 1 hello myfile.txt
- 显示匹配行周围的行数:使用
-C
选项可以同时显示匹配行之前和之后的指定行数。例如:
grep -C 1 hello myfile.txt
- 排除匹配的行:使用
-v
选项可以排除匹配的行。例如:
grep -v hello myfile.txt
- 限制边界搜索:使用
-w
选项可以限制搜索的单词边界。例如:
grep -w hello myfile.txt
在这个例子中,如果我们使用 grep hello myfile.txt
,那么搜索结果将包含包含 hello
子字符串的行,例如 hello world
、 helloworld
等。但是,如果我们使用 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
- 匹配重复字符:
?
代表零个或一个重复字符。例如,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
- 匹配重复字符:
?
代表零个或一个重复字符。例如,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 的值进行判断。
代码语言:javascript复制#!/bin/bash
grep abc 111.txt > /dev/null
RET=$?
if [[ $RET == 0 ]]; then
{
echo "found"
}
else
{
echo "not found"
}
fi
在 bash
中, 可以直接使用 逻辑 表达式, 整个结构看起来更简单。
#!/bin/bash
grep abc 111.txt > /dev/null && {
echo "found"
} || {
echo "not found"
}