Grep 目录并返回带有行号的列表

Zac*_*ter 5 grep find xargs awk

我目前正在尝试更多地了解 bash 脚本和所有有趣的东西,我拼凑了这个小命令:

find $path | xargs grep -n $pattern | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

虽然这确实有效,但我想知道我是否在重新发明轮子。有没有更好的方法来搜索目录、grep 文件以获取模式并返回带有行号的列表?

Mat*_*teo 6

许多grep变体实现了递归选项。例如,GNU grep

-R, -r, --recursive
          Read all files under each directory, recursively; this is equivalent to the -d recurse option.
Run Code Online (Sandbox Code Playgroud)

然后您可以删除find

grep -n -r $pattern $path | awk '{ print $1 }'
Run Code Online (Sandbox Code Playgroud)

但这不仅仅是行号。awk正在打印第一列。这个例子

src/main/package/A.java:3:import java.util.Map;
src/main/package/A.java:5:import javax.security.auth.Subject;
src/main/package/A.java:6:import javax.security.auth.callback.CallbackHandler;
Run Code Online (Sandbox Code Playgroud)

将被打印为

src/main/package/A.java:3:import
src/main/package/A.java:5:import
src/main/package/A.java:6:import
Run Code Online (Sandbox Code Playgroud)

注意:import每一行中的 。您可能想用它sed来过滤输出。

由于:文件名中可能存在a,因此您可以使用-Zgrep 选项在文件名后输出空字符 (\0)。

grep -rZn $pattern $path | sed -e "s/[[:cntrl:]]\([0-9][0-9]*\).*/:\1/" 
Run Code Online (Sandbox Code Playgroud)

使用与之前相同的示例将产生

src/main/package/A.java:3
src/main/package/A.java:5
src/main/package/A.java:6
Run Code Online (Sandbox Code Playgroud)