递归grep仅匹配特定行号

Pie*_*ean 3 grep find awk ripgrep

如何找到在特定行号上包含特定模式的文件?假设我有一个目录,其中包含一堆包含 3 行的文本文件,例如:

Title A
Category X
Description Y
Run Code Online (Sandbox Code Playgroud)

如何 grep/过滤每个在线Category X文件2?如何找到包含Title Aas 行的文件1

我查看了 grep 手册页、ripgrep 和替代方案,但不确定是否可以将模式搜索限制为特定行号。

Ark*_*zyk 9

awk你可以这样使用:

awk 'FNR == 2 && /Category X/ {print FILENAME}' *
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,“awk”可以用极少的代码完成的事情总是令人惊讶。 (2认同)

αғs*_*нιη 7

当在第二行中找到模式时,您可以使用findwithawk来退出处理文件的其余部分,或者如果在第二行中没有找到模式,也可以退出。

find -type f -name 'xyz*.txt' -exec \
    awk 'NR==2{ if(/pattern/) print FILENANE; exit }' {} \;
Run Code Online (Sandbox Code Playgroud)

  • @DanieleGrassini 因为如果第 2 行与模式不匹配,它将不会采取操作,不会退出,并且会读取文件的其他百万行,绝望地等待 NR == 2 再次发生。 (3认同)

Rud*_*diC 6

grep只是为了好玩:

PAT="Category X"
LN=2
> grep -n "$PAT" file* | grep ":$LN:$PAT$" | grep -o "^[^:]*"
file1
file2
Run Code Online (Sandbox Code Playgroud)