我最近一直在使用egrep命令(只是出于对grep的偏好)而且我注意到了一个我不完全理解的行为。
当我在我的主目录中运行以下命令时:
egrep -r "main" *
它符合我的预期,并返回包含“main”的所有行和相应文件。
虽然如果我输入:
egrep -r "main"
忘了把明星放在最后,它似乎只是永远地挂了。
我希望有人能够阐明为什么会这样做以及它在做什么?
谢谢:)
答案 0 :(得分:6)
正在等待来自stdin
的输入,因为您未在grep
联机帮助页中指定文件名:
NAME
grep, egrep, fgrep - print lines matching a pattern
SYNOPSIS
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]
DESCRIPTION
Grep searches the named input FILEs (or standard input if no files are named, or the file name - is given) for lines containing a match to the given PATTERN. By default, grep
prints the matching lines.
答案 1 :(得分:4)
grep(或egrep)需要知道要搜索的文件。通过包含*
,您可以告诉它搜索当前目录中的所有文件。
如果你不包含*
,它就不知道在哪里看,所以它等待你的输入,并会提示你输入搜索(输入,然后按ctrl + d终止标准输入模式)。
此行为不是grep独有的。任何需要输入的命令都希望输入来自文件或来自标准输入(stdin)。
stdin数据可以来自管道,也可以在输入命令后在提示符下手动输入(这是您在认为挂起时所看到的)。正如我所提到的,按Ctrl + D将使您退出该输入模式。
答案 2 :(得分:3)
您没有提供路径,因此grep会在stdin
上等待数据。
路径示例:
egrep -r "pattern" .
< - 在当前目录和子目录中搜索
cat file | egrep "pattern"
< - 从管道中搜索数据