如何使用grep查找某文件夹下所有.py文件中的指定字符串

  1. grep的基本使用
  2. 使用grep命令的-R选项
  3. 使用find命令实现
  4. 比较

grep的基本使用

grep命令可以使用正则表达式来搜索文件中的特定字符串,而且需要搜索多个文件或者一类文件的时候可以模糊匹配文件名。例如使用*.py可以匹配所有.py结尾的文件。

但是grep模糊匹配文件名只能找当前目录下的文件,不能找到其子目录下的文件。例如命令grep "xxx" *.py,如果当前文件夹下有一个abc.py,子目录sub中有一个文件efg.py(相对路径是sub/efg.py)那么grep命令只会搜索abc.py中的字符串。

如果想要搜索当前文件夹及其子文件夹中的所有文件,那么有两种方法可以实现,分别为使用grep命令的-R选项使用find命令实现

使用grep命令的-R选项

grep命令中,-R选项能指定grep搜索文件夹,并使用--include选项指定模糊匹配的文件名,多个文件名可以使用多个--include来实现。例如下面命令实现了搜索当前目录下所有.py和.json文件中的数字串:

1
egrep -R --include="*.py" --include="*.json" "[[:digit:]]+" .

使用find命令实现

find命令用于查找文件,查找的结果可以使用-exec选项传递给后续的命令,在后续命令中可以使用{}代替find的查找结果。如下命令实现与上文相同的功能:

1
2
3
4
# `-type f`为指定find返回结果类型是文件;
# `-or`链接不同的文件名匹配条件
# `-exec`选项以" \;"结尾。
find . -name "*.py" -or -name "*.json" -type f -exec egrep "[[:digit:]]+" {} \;

比较

使用grep中的-R选项似乎更直观方便一些,而且输出结果是带文件路径的,更加全面。