Mac 命令学习 - grep
背景知识
grep是linux中常用的文本处理的工具,与之类似的工具有sed和awk,它们分别适用于不同的场景。同时要想很好的使用grep等文本处理工具,需要对正则表达式有一定的了解。
grep vs sed vs awk
grep主要用于对文本、文件进行搜索,查找出符合要求的字符串并输出相关的内容。
sed和awk则是更强大文本处理工具,适用于更复杂的场景。sed是一个基于字符流的处理工具(stream editor),不仅可以查找文字还可以对文本进行操作,比如说修改、删除、插入等。awk则是更加强大的工具,它本身是一个完整的编程语言,可用于对数据的提取处理然后生成一些报表,主要针对类csv格式的文件。
正则表达式
to be written
grep的种类
- grep | grep使用简单的模式和正则表达式进行搜索。
- egrep | egrep使用拓展版的正则表达式,包含更多的正则表达式功能。
- fgrep | fgrep是加速版的grep,主要适用于简单的模式匹配。
- zgrep, zegrep, zfgrep | 与grep, egrep, fgrep 效果相同,只是可以接受一个由compress或gzip压缩出来的压缩包进行搜索。在现在的操作系统中,多种的grep使用的是同一个binary,而不是不同的binary。比如说
grep -E
其实等效于egrep,grep -F
等效于fgrep。
常用参数
-A num, --after-context=num
- 打印出找到的匹配行后num行。这个跟-B
,-C
类似功能,主要用于查看上下文。
-B num, --before-context=num
- 打印出找到的匹配行前num行。
-C[num, --context=num]
- 打印出找到的匹配行前后num行,相当于-A num -B num
。
-c, --count
- 统计出匹配的总行数,同一行有两个匹配也只算一行。
--colour=[when, --color=[when]]
- 将匹配的字符标记为彩色,when可以是’never’,‘auto’或’always’。
-e pattern, --regexp=pattern
- 制定在搜索中使用的匹配模式,多用于指定多个匹配模式的情况。
-H
- 在每一行前面打印出匹配的文件名,在多个文件的情况下这个是默认选项。
-h
- 在多个文件的情况下不打印出匹配的文件名。
-n
- 打印出匹配所在行的行数。
-i, --ignore-case
- 查找时忽略大小写。
-R, -r, --recursive
- 递归的去查找子目录下的文件。
-v, --invert-match
- 打印出不匹配的行。
-w, --word-regexp
- 只匹配整个单词。
案例学习
实验文件,随便找了一个莎士比亚的十四行诗:
1 | $ cat demofile |
在文件中搜索某个字符串。
1
2
3
4$ grep "and" demofile
Thou art more lovely and more temperate:
Nor shall Death brag thou wander'st in his shade,
So long lives this and this gives life to thee.匹配整个单词。
上面的例子中搜索and这个字符串匹配了wander这个单词,如果我们只想搜and这个单词可以使用
-w
参数。1
2
3$ grep -w "and" demofile
Thou art more lovely and more temperate:
So long lives this and this gives life to thee.忽略大小写
1
2
3
4
5
6$ grep -i -w "and" demofile
Thou art more lovely and more temperate:
And summer's lease hath all too short a date:
And often is his gold complexion dimm'd;
And every fair from fair sometime declines,
So long lives this and this gives life to thee.使用正则表达式
只要把匹配的字符串换成需要的正则表达式即可。比如说需要搜索以And开头的行。
1
2
3
4$ grep "^And" demofile
And summer's lease hath all too short a date:
And often is his gold complexion dimm'd;
And every fair from fair sometime declines,显示上下文
有时候搜出来需要看看上下文,可以利用上面提到的
-B
,-A
和-C
来实现。比如想要找出包含”nature”的句子并打印出上下两行。
1
2
3
4
5
6$ grep -C2 "nature" demofile
And often is his gold complexion dimm'd;
And every fair from fair sometime declines,
By chance or nature's changing course untrimm'd
But thy eternal summer shall not fade统计出匹配的总行数
比如说想要统计出现”to”的行数
1
2$ grep -c "to" demofile
5如果想要统计出现的总次数的话,grep本身没有办法满足这个需求,需要使用sed或awk来实现。或者结合wc来实现。
1
2$ grep -o "to" demofile| wc -l
5高亮匹配文字
高亮匹配文字可以让肉眼可以第一时间的看到匹配结果,利用–color=auto/always来实现。此处nature高亮状。
1
2$ grep --color=auto "nature" demofile
By chance or nature's changing course untrimm'd简单匹配多个模式
查找多个字符串可以使用
|
字符来进行简单的匹配。比如说"heaven|nature"
表示匹配heaven或者nature。因为这个是正则表达式的拓展部分,所以需要使用-E
或者egrep。1
2
3$ grep -E "heaven|nature" demofile
Sometime too hot the eye of heaven shines,
By chance or nature's changing course untrimm'd复杂匹配多个模式
需要找出符合多个模式的匹配。比如说,找出以”When”开头或者包含”fade”的行。
1
2
3$ grep -e "^When" -e "fade" demofile
But thy eternal summer shall not fade
When in eternal lines to time thou growest:找出不满足条件的匹配
在一些情况下我们需要找出不满足某个条件的行,这个时候就可以用
-v
来实现了。比如说想找出首字母不是大写字母的行。
1
2$ grep -v "^[A-Z]" demofile
sonnet 18打印出匹配所在行的行数
1
2
3$ grep -e "^When" -e "fade" -n demofile
13:But thy eternal summer shall not fade
16:When in eternal lines to time thou growest:打印出文件名
进行多个文件搜索的情况下,默认会打印出文件名。
1
2
3
4
5$ grep -e "^When" -e "fade" demofile demofile2
demofile:But thy eternal summer shall not fade
demofile:When in eternal lines to time thou growest:
demofile2:But thy eternal summer shall not fade
demofile2:When in eternal lines to time thou growest:
[EOF]