我正在尝试使用grep搜索我的rails目录。我正在寻找一个特定的单词,我想grep打印出文件名和行号。
有一个grep标志会为我做这个吗?我一直在尝试使用-n
和-l
的组合,但这些组合要么打印出没有数字的文件名,要么只是将大量文本转储到终端,这些文本无法轻易读取
例如:
grep -ln "search" *
我需要将它管道输入awk吗?
答案 0 :(得分:118)
我认为-l
限制性太强,因为它会抑制-n
的输出。我建议-H
(--with-filename
):打印每个匹配的文件名。
grep -Hn "search" *
如果输出太多,请尝试-o
仅打印匹配的部分。
grep -nHo "search" *
答案 1 :(得分:29)
grep -rin searchstring * | cut -d: -f1-2
这就是说,递归搜索(对于本例中的字符串searchstring
),忽略大小写,并显示行号。该grep的输出类似于:
/path/to/result/file.name:100: Line in file where 'searchstring' is found.
接下来,我们使用冒号:
将结果传递给cut命令作为字段分隔符,并显示字段1到2。
当我不需要行号时,我经常使用-f1
(只是文件名和路径),然后将输出传递给uniq
,这样我只能看到每个文件名一次:< / p>
grep -ir searchstring * | cut -d: -f1 | uniq
答案 2 :(得分:11)
我喜欢使用:
grep -niro 'searchstring' <path>
但那只是因为我总是忘记其他方式,我不能忘记 Robert de grep -
niro 因为某些原因:)
答案 3 :(得分:1)
@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
答案 4 :(得分:0)
这是我使用已投票的答案搜索树以查找包含字符串的fortran文件的方式:
find . -name "*.f" -exec grep -nHo the_string {} \;
没有nHo,您只会了解某个文件在某个位置与该字符串匹配。