在Linux系统中,有三个非常常用的文本处理命令:grep,awk,sed。使用这三个命令可以实现非常“炫酷”的文本操作。这篇博文就带大家一起来认识这三个命令中的grep命令。
1. grep
grep命令用来对Linux中的文本进行匹配。
$ echo -e "this is a word\nnext line" | grep word this is a word
也可以使用它在文件中进行匹配。
$ grep pattern filename this is the line containing pattern
文件可以指定多个。
$ grep "match_text" file1 file2 file3 ...
匹配模式也可以指定多个,每个格式之间是or的关系
$ grep -e "match_text1" f -e "match_text2" file
grep命令支持使用正则表达式。以上的命令使用的都是基础的正则表达式,-E选项使grep可以使用扩展的正则表达式,也可以使用egrep命令来替代。
$ grep -E "[a-z]+" filename
使用选项-o可以只输出匹配到的文本。
$ echo this is a line. | egrep -o "[a-z]+\." line
选项-v可以起到反转的效果,打印出不匹配match_pattern的所有行。
$ grep -v match_pattern file
选项-c能够统计出匹配模式的文本行数。
$ grep -c "text" filename 10
选项-n可以打印出匹配字符串所在行的行号。
$ cat sample1.txt gnu is not unix linux is fun bash is art $ cat sample2.txt planetlinux $ grep linux -n sample1.txt 2:linux is fun
如果涉及多个文件,该选项也会随输出结果打印出文件名。
$ grep linux -n sample1.txt sample2.txt sample1.txt:2:linux is fun sample2.txt:2:planetlinux
使用-R或-r选项可以使grep实现递归搜索。
$ cd src_dir $ grep "test_function()" . -R -n ./miscutils/test.c:16:test_function();
使用-q选项可以使grep实现静默输出,在静默模式中,grep命令不会输出任何内容。它仅是运行命令,然后根据命令执行成功与否返回退出状态。0表示匹配成功,非0表示匹配失败,下面这个脚本利用grep的静默模式来测试文件中是否有匹配文本。
#!/bin/bash # 文件名: silent_grep.sh # 用途: 测试文件是否包含特定的文本内容 if [$# -ne 2]; then echo "Usage: $0 match_text filename" exit 1 fi match_text=$1 filename=$2 grep -q "$match_text" $filename if [$? -eq 0]; then echo "The text exists in the file" else echo "Text does not exist in the file" fi
选项-l可以列出匹配模式所在的文件。
$ grep -l linux sample1.txt sample2.txt
sample1.txt
sample2.txt
与之相反的是,-L选项会返回一个不匹配的文件列表。
在grep中,可以指定在指定的文件中搜索,要做到这一点,需要为命令添加--include选项。
$ grep "main()" . -r --include *.{c,cpp}
使用选项--exclude在搜索过程中排除指定的文件。
$ grep "main()" . -r --exclude "README"
--exclude-dir可以排除目录
$ grep main . -r -exclude-dir CVS
使用-w选项可以实现匹配整个单词,而不是单词的某一部分。
$ grep -w "text" filename
通过参数控制,可以打印匹配的单词前后具体的行。
-A: 指定输出匹配结果及之后的额外行数。
$ seq 10 | grep 5 -A 3 5 6 7 8
-B:指定输出匹配结果及之前的额外行数。
$ seq 10 | grep 5-B 3 2 3 4 5
-C:指定输出匹配结果之前及之后的额外行数。
$ seq 10 | grep 5-C 3 2 3 4 5 6 7 8