grep 实战用法
grep 的全称是 global regular expression print,在 Linux 诸多命令行工具中可以说是最强大,最经常使用的。我们可以用 grep 来找到需要的文本信息。
搜索文件名
在某个目录下,寻找匹配某个名称的文件,可以结合 ls
和 grep
的能力来做。
$ ls -l | grep employee
-rw-r--r-- 1 bytedance staff 209 8 28 23:47 employee.txt
在多个文件中寻找字符串
基本格式为
grep “string” filename1 filename2
为此我们将 employee.txt 拷贝一份,叫做 empbackup.txt,看看查找 "sale" 字符串的结果
$ grep sale employee.txt empbackup.txt
employee.txt:varun manager sales 50000
employee.txt:tarun peon sales 15000
employee.txt:deepak clerk sales 23000
employee.txt:sunil peon sales 13000
empbackup.txt:varun manager sales 50000
empbackup.txt:tarun peon sales 15000
empbackup.txt:deepak clerk sales 23000
empbackup.txt:sunil peon sales 13000
通配符
其实多个文件的场景,如果前后缀一样,我们可以直接用 * 来代替。将上面的命令替换成:
$ grep sale emp*
empbackup.txt:varun manager sales 50000
empbackup.txt:tarun peon sales 15000
empbackup.txt:deepak clerk sales 23000
empbackup.txt:sunil peon sales 13000
employee.txt:varun manager sales 50000
employee.txt:tarun peon sales 15000
employee.txt:deepak clerk sales 23000
employee.txt:sunil peon sales 13000
忽略大小写
grep 支持忽略大小写的 flag 有三种写法:
- -i
- -y
- --ignore-case
通常情况下我们会使用 -i 比较多。
我们把 employee.txt 中的 tarun
改成 Tarun
看一下:
$ grep tarun employee.txt
此时没有数据返回。
$ grep -i tarun employee.txt
Tarun peon sales 15000
数据返回,符合预期。
上色
还是上面的正则的例子,坦率讲文本比较长的时候不好看出来,这个时候我们就可以用 --color 这个flag 来显示到底这一行的哪个部分 match 了我们提供的 pattern。
执行 grep "this.*data" regtest.txt --color
命令
最后匹配上的部分变成了红色
打印匹配次数
有时候我们不需要真的看到那些匹配的行,而是只需要知道匹配了几次,这时候可以用 -c 这个 flag 来实现。
$ grep –c “string” filename
排除搜索
前面都是我们给出一个 pattern,找能匹配上这个 pattern 的行。但有些时候我们是希望逆着来,找到不匹配这个pattern的行,grep 对此也提供了支持,也就是 -v。
还是用上一节的 testfile3,如果这次我们想找不包含 "account" 字符串的部分,就可以这样:
$ grep –v “account” testfile3
全单词匹配
$ grep -w "unix" geekfile.txt unix is great os. unix is opensource. unix is free os.
展示行号
这次用 -n 来实现,我们还是基于 employee.txt 搜索 sale。
$ grep -n sale employee.txt
3:varun manager sales 50000
6:Tarun peon sales 15000
7:deepak clerk sales 23000
8:sunil peon sales 13000
递归整个目录