命令grep
在文件中搜索指定的文本,以便在终端查看需要的内容,grep是一个强大的文本处理工具,提供了非常多的选项和功能,并通过和其他工具的结合可以达到更加强大的功能。通过和正则表达式的组合,可以实现非常多的功能。
格式:
grep match_patten filename
在匹配显示时,高亮显示
grep match_patten filename --color
从studin中搜索
echo 'xxx' | grep 'xxx'
使用正则表达式的匹配
grep -E "[a-z]+"
# echo "this ia a page." | grep -E "[a-z]+\." this ia a page.
或
egrep "[a-z]+"
# echo "this ia a page." | egrep "[a-z]+\." this ia a page.
只显示匹配到的行-o
# echo "this ia a page." | grep -o -E "[a-z]+\." page.
# echo "this ia a page." | egrep -o "[a-z]+\." page.
将没有匹配到的行显示出来-v:invert(反转)
# cat test.txt apple block count this
#显示以a开头的文件 # cat test.txt | grep -E "^a" apple #显示不以a开头的文件 # cat test.txt | grep -E -v "^a" block count this
统计匹配到的行数-c:count,匹配行的数量,而不是匹配到的次数
# cat test.txt apple apple block count this # cat test.txt | grep -E -c "^a" 2
统计匹配到的次数,通过管道输出给wc -l
# echo -e "1 2 3 4\nhello\n5 6 7" | grep -e "[0-9]" 1 2 3 4 5 6 7 # echo -e "1 2 3 4\nhello\n5 6 7" | grep -e "[0-9]" | wc -l 2 # echo -e "1 2 3 4\nhello\n5 6 7" | grep -e "[0-9]" | wc -c 14
打印出匹配到的行的行号
# cat test1.txt help orange this # grep -n orange test1.txt 2:orange
从多个文件中匹配
# grep -n this test1.txt test.txt test1.txt:3:this test.txt:5:this
打印出字符的偏移:-b,总是和-o一起使用
# echo this is a page. | grep -b -o "a" 8:a 11:a
从多个文件中找出匹配的文本属于哪个文件 -l word
# grep -l this test1.txt test.txt test1.txt test.txt
grep的其他选项
递归搜索文件:-R
忽略样式的大小写:-i
# grep -i count test.txt count COUNT
指定多个样式进行匹配,其他的选项放在所有-e 'word'的后面
# cat test.txt apple apple block count this COUNT
# grep -e "apple" -e "count" -i test.txt apple apple count COUNT
指定一个样式文件进行匹配,-f:其他选项放在样式文件之后
grep -f patten_file source_file
#样式文件 # cat patten apple count # grep -f patten -i test.txt apple apple count COUNT
在当前目录下搜索包含特定字符的文件
# grep "this" . -r --include *.txt ./test1.txt:this test.txt:this
在当前目录下搜索出特定文件之外的其他文件是否包含匹配的字符(也就是说,在搜索时,不搜索.txt结尾的文件)
# grep -e "this" . -r --exclude
grep脚本实现正则匹配
#!/bin/bash # if [ $# -ne 2 ];then echo "$0 patten_match filename"; fi match=$1 filename=$2 grep $match $filename if [ $? -ne 0 ];then echo 'grep failed' else echo 'grep successful' fi
匹配某个结果之后的3行
# seq 10 | grep 5 -A 3 5 6 7 8
匹配某个结果之前的3行
# seq 10 | grep 5 -B 3 2 3 4 5
匹配某个结果之前之后的3行
# seq 10 | grep 5 -C 3 2 3 4 5 6 7 8
以一个定界符进行分割,匹配到的重复的行
echo -e "a\nb\nc\nd\nf\na\nb\a" | grep a -A 1 a b -- a b