ChatGPT解决这个技术问题 Extra ChatGPT

在 grep 输出中显示文件名和行号

我正在尝试使用 grep 搜索我的 rails 目录。我正在寻找一个特定的单词,我想用 grep 打印出文件名和行号。

是否有一个 grep 标志可以为我执行此操作?我一直在尝试使用 -n-l 的组合,但它们要么打印出没有数字的文件名,要么只是将大量文本转储到终端,这些文本不容易阅读。

前任:

  grep -ln "search" *

我需要通过管道将它传输到 awk 吗?


D
Drew Gaynor

我认为 -l 限制性太强,因为它抑制了 -n 的输出。我建议 -H (--with-filename):打印每个匹配的文件名。

grep -Hn "search" *

如果输出过多,请尝试 -o 以仅打印匹配的部分。

grep -nHo "search" * 

这个答案也对我有用。我需要递归搜索并使用此示例命令: grep -Hnor "localhost" 。此列表与文件名和行号匹配,简洁明了。
这也会显示结果,而不仅仅是文件名和行号
i
ib.
grep -rin searchstring * | cut -d: -f1-2

这就是说,递归搜索(在本例中搜索字符串 searchstring),忽略大小写,并显示行号。该 grep 的输出将类似于:

/path/to/result/file.name:100: Line in file where 'searchstring' is found.

接下来,我们使用冒号 : 作为字段分隔符并显示字段 1 到 2,将结果传递给 cut 命令。

当我不需要行号时,我经常使用 -f1(只是文件名和路径),然后将输出通过管道传输到 uniq,这样我就只能看到每个文件名一次:

grep -ir searchstring * | cut -d: -f1 | uniq

我觉得这最好地回答了最初的问题。仅文件名和行号。
请注意,如果您有 Windows 的绝对路径名(例如 `C:\Users\me\git`),这将不起作用,因为它已经包含一个冒号。
B
Bas van Ommen

我喜欢使用:

grep -niro 'searchstring' <path>

但这只是因为我总是忘记其他方式,并且出于某种原因我无法忘记 Robert de grep - niro :)


从没想过我会为上述内容投票。只是一个有趣的分享。谢谢! (但它确实有效——至少在 MacOS 上)
喜欢你记住这一点的方式!
I
Ictus

来自@ToreAurstad 的评论可以拼写为grep -Horn 'search' ./,这样更容易记住。

grep -HEroine 'search' ./ 也可以工作;)

对于好奇:

$ grep --help | grep -Ee '-[HEroine],'
  -E, --extended-regexp     PATTERNS are extended regular expressions
  -e, --regexp=PATTERNS     use PATTERNS for matching
  -i, --ignore-case         ignore case distinctions
  -n, --line-number         print line number with output lines
  -H, --with-filename       print file name with output lines
  -o, --only-matching       show only nonempty parts of lines that match
  -r, --recursive           like --directories=recurse

K
Karl I.

以下是我如何使用投票的答案来搜索树以查找包含字符串的 fortran 文件:

find . -name "*.f" -exec grep -nHo the_string {} \;

如果没有 nHo,您只能知道某个文件在某处与字符串匹配。