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

Awk 在grep输出中显示文件名和行号,awk,grep,Awk,Grep,我正在尝试使用grep搜索我的rails目录。我正在寻找一个特定的单词,我想grep打印出文件名和行号 有没有一个grep标志可以帮我做到这一点?我一直在尝试使用-n和-l的组合,但它们要么打印出没有数字的文件名,要么只是将大量文本转储到终端,而这些文本不容易读取 例: 我需要把它输送到awk吗 我认为-l限制太多,因为它会抑制-n的输出。我建议-H(-with filename):打印每个匹配的文件名 grep-Hn“搜索”* 如果输出太多,请尝试-o仅打印匹配的零件 grep-nHo“搜索

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

有没有一个grep标志可以帮我做到这一点?我一直在尝试使用
-n
-l
的组合,但它们要么打印出没有数字的文件名,要么只是将大量文本转储到终端,而这些文本不容易读取

例:


我需要把它输送到awk吗

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

grep-Hn“搜索”*
如果输出太多,请尝试
-o
仅打印匹配的零件

grep-nHo“搜索”*
也就是说,递归搜索(本例中搜索字符串
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
我喜欢使用:

grep-niro'searchstring'


但那只是因为我总是忘记其他的方式,我不能忘记罗伯特·德·格雷普——尼罗,因为某种原因:)

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

grep-女英雄“搜索”。/
也可以工作;)

对于好奇的人:

$ 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

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

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

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

我觉得这最好地回答了最初的问题。仅限文件名和行号。请注意,如果Windows的绝对路径名为'C:\Users\me\git',则此选项不起作用,因为它已经包含一个冒号。我从未想过我会获得以上选项的投票。只是一个有趣的分享。谢谢(但它确实有效——至少在MacOS上是如此)喜欢你记住这一点的方式!这个答案也适用于我。我需要递归搜索,并使用了这个示例命令:grep-Hnor“localhost”。这将列出所有与文件名和行号匹配的内容,简短明了。这还将显示结果,而不仅仅是文件名和行号相关:。
$ 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
find . -name "*.f" -exec grep -nHo the_string {} \;