![Linux 输出出现字符串匹配的行号](https://linux22.com/image/1369974/Linux%20%E8%BE%93%E5%87%BA%E5%87%BA%E7%8E%B0%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D%E7%9A%84%E8%A1%8C%E5%8F%B7.png)
我想要做的是增强我已经拥有的命令,以返回指定字符串出现的行号:
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
。