我正在尝试编写一个脚本(比方说 script1.sh),该脚本在某个目录及其子目录中的文件中以及仅在具有某个文件的文件中查找包含我给出的单词的行扩大。所以./script1.sh python py this.is.what.i.look.for
应该给出这样的结果:
python/abc/file1.py:11: this.is.what.i.look.for and the line can contain other things as well
python/file2.py:412: this.is.what.i.look.for this.toggleButton.getElement())
我尝试使用 grep -r 在子目录中搜索并设法找到这些行。
grep -r -e $3 $1
给了我这些行,但未能清除具有不同文件扩展名的其他文件,并且我找不到在代码中包含 $2 的方法。我也未能将行号放在中间。我尝试将输出分成两部分,如下所示:python/abc/file1.py:
this.is.what.i.look.for and the line can contain other things as well
withawk -F " " '{print $1}
但无法将它们重新组合在一起。我想将 grep 函数的输出部分分配给变量,然后将它们放回一起,但也失败了。t1="grep -r -e $3 $1 | awk -F " " '{print $1}'"
我尝试使用“”、' '、$() 来赋值,因为我不知道该使用哪一个,但它们都不起作用。
答案1
至少对于 GNU grep
,您可以使用--include
(and --exclude
) 来限制递归 grep 中的匹配,使用 shell 样式的 glob 表达式:
grep -r --include='*.py' -e pattern dir
您可以添加-n
或--line-number
添加编号。最后,记得引用位置参数 - 所以
grep -nr --include="*.$2" -e "$3" "$1"