shell文本处理三剑客—grep

grep

Global search regular expression and print out the line
全面搜索研究正则表达式并显示出来
grep命令是一种强大的文本搜索工具,根据用户指定的“模式”对目标文本进行匹配检查,打印匹配到的行,由正则表达式或者字符及基本文本字符所编写的过滤条件

实战演练

1、在stdin(标准输入)中搜索匹配特定模式的行
echo -e “this is a word\nnext line” | grep word
在这里插入图片描述
2、在文件中搜索匹配模式的文本行
grep linux textfile 或者 grep “linux” textfile
在这里插入图片描述
3、在多个文件中搜索匹配特定模式的文本行
grep linux file1 file2 textfile …
在这里插入图片描述
4、选项–color可以在输出行中着重标记出匹配到的模式,尽管该选项在命令行中的放置位置没有强制要求,不过惯常作为第一个选项出现。
grep --color=auto linux textfile
在这里插入图片描述
5、grep命令默认使用基础正则表达式。这是先前描述的正则表达式的一个子集。选项-E可以grep使用扩展正则表达式。也可以使用默认启用扩展正则表达式的egrep命令。
正则表达式的扩展规范和基本规范基本相同。只是在基本规范,有些字符(? + {} | ())应解释为普通字符,要表达上述特殊含义,则需要加入\转义。反之,在扩展模式下,? + {} | () 应被理解成特殊含义,要取其字面值,也要对其进行\转义。所以,grep工具带上-E选项,表示使用扩展正则来进行匹配,如果没有,则表示使用基本正则进行匹配
grep -E “[a-z]+” filename 或 egrep “[a-z]+” filename
在这里插入图片描述
6、选项-o可以只输出匹配到的文本
echo this is a line. | egrep -o “[a-z]+.”
在这里插入图片描述
7、选项-v可以打印出不匹配match_pattern的所有行
grep -v match_pattern file
选项-v能够反转(invert)匹配结果
在这里插入图片描述
8、选项-c能够统计出匹配模式的文本行数
grep -c linux textfile
在这里插入图片描述
需要注意的是-c是统计匹配行的数量,并不是匹配的次数,例如:
echo -e “1 2 3 4\nhello\n5 6” | grep -c “[0-9]”
在这里插入图片描述
尽管有6个匹配项,但grep命令只输出2,因为只有两个匹配行,在单行出现的多次匹配只被计为一次

9、要统计文件中匹配项的数量,可以使用以下技巧
echo -e “1 2 3 4\nhello\n5 6” | grep -o [0-9] | wc -l
在这里插入图片描述

10、选项-n可以打印出匹配字符串所在行的行号
grep linux -n case.txt
或者 cat case.txt | grep linux -n
在这里插入图片描述
如果涉及多个文件,该选项也会输出结果打印出文件名
grep linux -n case.txt case1.txt
在这里插入图片描述

11、选项-b可以打印出匹配出在行中的偏移。配合选项-o可以打印出匹配所在的字符或字节偏移
echo gnu is not unix | grep -b -o not
在这里插入图片描述
字符在行中的偏移是从0开始计数,不是1

12、选项-l可以列出匹配模式所在的文件
grep -l linux case.txt case1.txt
在这里插入图片描述
和-l效果相反的选项是-L,它会返回一个不匹配的文件列表

补充内容

grep命令是linux/unix系统中最为全能的命令之一,他还包括其他一些选项,可用于搜索目录,选择待搜索的文件等
1、递归搜索多个文件
如果需要在多级目录中对文本进行递归搜索,可以使用以下命令
grep linux . -R -n
在这里插入图片描述
命令中的.指定了当前目录
提示:grep的-R选项与-r选项功能相同
2、忽略模式中的大小写
选项-i可以在匹配模式时不考虑字符的大小写
echo hello world | grep -i hello
在这里插入图片描述
3、使用grep匹配多个模式
选项-e可以指定多个匹配模式:
echo this is a line of text | grep -o -e “this” -e “line”
在这里插入图片描述
可以将多个模式定义在文件中,选项-f可以读取文件并使用其中的模式(一个模式一行):
cat pat_file
hello
cool
echo hello this is cool | grep -f pat_file
在这里插入图片描述
4、在grep搜索中指定或排除文件
grep可以在搜索过程中使用通配符指定(include)或排除(exclude)某些文件
使用 --include 选项在目录中递归的搜索所有的.c和.cpp文件
grep “main()” . -r --include *.{c,cpp}
在这里插入图片描述

5、grep的静默输出
有时候,我们并不打算查看匹配的字符串,而只是想知道是否能够成功匹配,这可以通过设置grep的静默选项-q来实现。在静默模式中,grep命令不会输出任何内容,他仅是运行命令,然后根据命令执行成功与否返回退出状态,0表示匹配成功,非0表示匹配失败
下面这个脚本利用grep的静默模式来测试文件中是否有匹配文本

if [ $# -ne 2 ]; then
        echo "Usage: $0 match_text filename"
        exit 1
fi

match_text=$1
filename=$2
grep -i -q "$match_text" $filename
if [ $? -eq 0 ]; then
        echo "The text exists in the file!"
else
        echo "Text does not exists in the file!"
fi

执行脚本:
./silent_grep.sh Student student_data.txt
在这里插入图片描述

6、打印出匹配文本之前或之后的行
基于上下文的打印是grep的一个挺不错的特性,当grep找到了匹配模式的行时,它只会打印这一行,但我们也需要匹配行之前或者之后的n行。这可以通过控制选项-B和-A来实现
选项-A可以打印匹配结果之后的行
seq 10 | grep 5 -A 3
在这里插入图片描述
选项-B可以打印匹配结果之前的行
在这里插入图片描述
选项-A和-B可以结合使用,也可以直接使用-C,分别打印出匹配结果之前及之后的n行
seq 10 | grep 5 -A 3 -B 3或者 seq 10 | grep 5 -C 3
在这里插入图片描述

如果有多个匹配,那么使用–作为各部分之间的分隔
echo -e “a\nb\nc\na\nb\nc” | grep a -A 1
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/gd0306/article/details/86485303