原文网址:Linux命令--grep--使用/教程/示例_IT利刃出鞘的博客-CSDN博客
简介
说明
本文介绍Linux的grep命令的用法。
grep命令简介
grep命令用于搜索文件中的内容(字符串)。
grep支持 正则表达式。(而且默认使用正则表达式)
技巧
技巧 | 说明 |
grep -e pattern1 | pattern2 files 或者grep pattern1\| pattern2 files | 显示匹配 pattern1 或 pattern2 的行。 例: 递归查找有“hello”或者“hi”的文件 grep "hello\|hi" * -nsr 或者grep -e "hello|hi" * -nsr |
grep pattern1 files | grep pattern2 | 显示既匹配 pattern1 又匹配 pattern2 的行 |
选项
选项 | 含义 |
-a 或 --text | 不要忽略二进制的数据。 |
-A n 或 --after-context=<n> | 显示匹配到的字符串所在的行及其后n行。 (after) |
-b 或 --byte-offset | 在显示符合样式的那一行之前,标示出该行第一个字符的编号。 |
-B n 或 --before-context=<n> | 显示匹配到的字符串所在的行及其前n行。(before) |
-c | 显示总共有多少行被匹配到了,而不是显示被匹配到的内容 |
-C n | 显示匹配到的字符串所在的行及其前后各n行。(context) grep "hello" a.txt -C 10 |
--color | 关键字高亮显示 |
-d <动作> 或 --directories=<动作> | 当指定要查找的是目录而非文件时,必须使用这项参数。 比如:-d recurse |
-e <范本样式> 或 --regexp=<范本样式> | 将内容看为正则表达式。此时不需要加转义字符。 |
-E, --extended-regexp | 将内容看为扩展的正则表达式(ERE)。此时不需要加转义字符。 |
--exclude=FILE_PATTERN | 排除指定的文件(支持正则表达式) |
--exclude-from=FILE | 排除指定的文件来搜索(不支持正则表达式) |
--exclude-dir=DIR_PATTERN | 排除指定的目录来搜索(支持正则表达式) |
-f<规则文件> 或 --file=<规则文件> | 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。 |
-F, --fixed-strings | 将内容看为普通字符串,不使用正则表达式。 |
-G, --basic-regexp | 将引号内的内容看为基本的正则表达式(BRE)。此时需要加转义字符。 |
-h 或 --no-filename | 查询多文件时不显示文件名。 |
-H 或 --with-filename | 查询多文件时显示文件名 |
-i, --ignore-case | 不区分大小写地搜索。默认情况区分大小写 |
--include=FILE_PATTERN | 指定文件搜索(支持正则表达式) |
-l 或 --file-with-matches | 不区分大小写(只适用于单字符) |
-l 或 --file-with-matches | 查询多文件时只输出匹配的文件名,不输出内容。 |
-L 或 --file-without-matches | 查询多文件时只输出不匹配的文件名,不输出内容。 |
-n | 显示匹配行及行号 |
-o 或 --only-matching | 只显示匹配PATTERN 部分 |
-P, --perl-regexp | 使用Perl正则表达式。 |
-q 或 --quiet或--silent | 不显示任何信息。 |
-R, -r | 递归地。等价于:-d recurse |
-s 或 --no-messages | 不显示错误信息。 |
-v | 不显示该匹配字符串。 例:查找带有“abc”但不带有“aaa”的行:grep abc | grep -v aaa |
-w 或 --word-regexp | 只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’) |
-x --line-regexp | 只显示全列符合的列。 |
-y | 和指定"-i"参数相同 |
示例
基本用法
命令 | 作用 |
grep "hello" * -nsr | 在当前目录下的所有文件、目录中查找“hello” |
grep "hello" * -nsr -C 3 | 在当前目录下的所有文件、目录中查找“hello”,并打印上下3行 |
grep "hello\|hi" * -nsr | 在当前目录下的所有文件、目录中查找“hello”或“hi” |
grep '^root|bash$' * -nsr | 查找以 root 为行首的或以 bash 为行尾的行 |
grep "hello" kernel -nsr | 在当前目录的kernel子目录中查找“hello” |
grep "hello" a.txt -n | 在当前目录的a.txt文件中查找“hello” |
包含/不包含
命令 | 作用 |
grep "hello" --exclude-dir=dir1 | 在当前目录下查找除了dir1目录的hello |
grep "hello" --exclude-dir={dir1,dir2} | 在当前目录下查找除了dir1和dir2目录的hello |
grep "hello" --include=*.{php,c} * -nswr | 在当前目录及子目录的以.php和.c文件中搜索"hello" |
特殊字符
命令 | 作用 |
grep -e ".hello" * -nsr 或 grep "\.hello" * -nsr | 在当前目录下的所有文件、目录中查找“.hello” |
grep -e "client->flags" * -nsr 或 grep "client\->flags" * -nsr | 在当前目录下的所有文件、目录中查找“client->flags” |
最短匹配
默认情况下,grep的+和*都是贪婪匹配:匹配最长的数据,例如:
echo "abcdbcdef" | grep "a.*c"
结果
最短匹配的方法
使用Perl模式(-P参数),然后在+或*后加一个?。
echo "abcdbcdef" | grep -P "a.*?c"
打印出所有匹配项
有的数据会匹配多个,例如:
echo "1234123456" | grep -P ".*?4"
结果
实际上这是匹配了两段,可以将匹配项单独打印出来:
其他
命令 | 作用 |
grep "TEXTBASE" * -nsr | grep "s3c2440" | 找完TEXTBASE之后的结果再查找s3c2440。可达到指定s3c2440目录查找的类似效果 |
grep "hello" * -nsr | grep -v "word\|test" | 在当前目录及子目录查找"hello",排除有world或test的行。 注意,加了-v会不高亮"hello",如果要高亮,则后边加一个| grep "hello"。 |