我正在尝试使用grep搜索rails目录。我正在寻找一个特定的单词,我想grep打印出文件名和行号。
是否有grep标志可以帮我做到这一点?我一直在试图使用的组合-n
和-l
,但这些要么打印出来的文件名不带数字或只是倾出大量的文字来不能轻易读取终端。
例如:
grep -ln "search" *
我需要将其通过管道传输到awk吗?
Answers:
我认为-l
这过于严格,因为它会抑制的输出-n
。我建议-H
(--with-filename
):为每个匹配项打印文件名。
grep -Hn "search" *
如果那提供了太多的输出,请尝试-o
仅打印匹配的部分。
grep -nHo "search" *
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
我喜欢使用:
grep -niro 'searchstring' <path>
但这仅仅是因为我总是忘记其他方式,并且由于某种原因我也不能忘记罗伯特·grep -
德尼罗(Robert de niro) :)
@ToreAurstad的评论可以被拼写grep -Horn 'search' ./
,这更容易记住。
grep -HEroine 'search' ./
也可以工作;)
对于好奇:
$ grep --help | grep -Ee '-(H|E|r|o|i|n|e),'
-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