Linux 输出出现字符串匹配的行号

Linux 输出出现字符串匹配的行号

我想要做的是增强我已经拥有的命令,以返回指定字符串出现的行号:

grep -r -l -n -w "ePKI" /home/websites/www/* > /home/keywords.txt

上述命令返回的文件名如下

filename_where_keyword_appears_01.txt
filename_where_keyword_appears_02.txt
etc

我希望它做的是返回字符串在文件中出现的行号,例如:

filename_where_keyword_appears_01.txt 12 45 67 89

有人可以建议我改进我的命令来做这样的事情吗?

答案1

通过省略 -l 并使用 cut,您可能会获得与所需类似的结果,如下所示:

grep -r -n -w "ePKI" /home/websites/www/*|cut -d':' -f 1,2 > /home/keywords.txt

如果您需要的输出与您描述的完全一致,您可以尝试使用 awk:

awk -F, 'FNR==1 {printf "\n%s",FILENAME};/ePKI/ {printf " %d ",NR} END {printf "\n"}' /home/websites/www/*

将其与 find 结合起来进行递归:

find /home/websites/www/* -type f -print0 | xargs -0 awk -F, 'FNR==1 {printf "\n%s",FILENAME};/ePKI/ {printf " %d ",NR} END {printf "\n"}'

答案2

选项-l会抑制正常输出并仅打印文件名。省略选项-l并保留选项-n可查看文件名行号。此外,您还将看到匹配的行,或者在指定 option 时仅看到匹配的部分-o

相关内容