我正在使用 Ubuntu 16.04。
我想搜索某个单词,但也希望在终端上输出包含该单词的整个文件,以便我可以看到该单词在文件中的位置。但是,当我使用时grep
,它只会显示包含该单词的特定句子,而不是整个文件。
我可以使用什么命令来搜索单词,同时显示整个文件以及该单词所在的位置?
答案1
您grep
可以使用:
$ grep -E -e 'pattern' -e '$' file
或者简化形式:
$ grep -E 'pattern|$' file
从技术上来说这也是可行的:
$ grep -E 'pattern|^' file
甚至:grep -E 'pattern|' file
。它表示有模式的线条pattern
或根本没有模式的线条。所以一切都会匹配。
我已将grep
其别名为grep --color=always
,因此如果您没有,则必须自己传递颜色选项。
和less
:
$ less -p 'pattern' file
因此文件会在 less 中弹出,所需的术语会突出显示,您可以使用n和shift+n在匹配项之间跳转。
答案2
编辑:我误解了原始答案中的问题....我对其进行了编辑以产生所需的结果...我只在输出中显示文件名。我编辑了这个答案以使用该输出通过使用 less 显示整个文件(如 Ravexina 的答案所建议的那样)
...此外,这将仅返回less
在搜索目录时被 grep 匹配的文件(在 中)。...
我添加了-I
忽略二进制文件,它们可能会使less
交互变得混乱。如果您需要搜索二进制文件或 grep 可能“认为”是二进制的文件,请将其删除。
使用 grep 的“with-filename”标志来显示文件。(该标志是-H
)
我假设您正在梳理目录及其中的每个文件。如果在当前目录之外搜索,请使用*
以防止出现“是目录”错误而无结果。
grep -HI pattern /directory/* | less -p pattern $(awk -F ":" '{print $1}')
或者
grep --with-filename -I pattern /directory/* | less -p pattern $(awk -F ":" '{print $1}')
或者深入到子目录……
grep -rHI pattern /directory/* | less -p pattern $(awk -F ":" '{print $1}')
我不喜欢两次进入该模式,它可以改进
答案3
如果您想要查看所搜索文本在文件中的位置,请使用 C 标志。例如:
grep -C 5 'MySearchText' *
将显示包含文本的行以及预期搜索的前五行和后五行。
答案4
为了补充其他答案:您可以将“-n”添加到选项中以查看左侧的行号:
grep -n -C 3 "something" filename
将显示包含“something”的行,其中有 3 行“上下文”(即与“something”匹配的行之前和之后的 3 行),并且显示的每行开头都会附加其行号。