当没有添加目录或文件时,grep会做什么

时间:2013-02-01 20:50:38

标签: bash grep

我最近一直在使用egrep命令(只是出于对grep的偏好)而且我注意到了一个我不完全理解的行为。 当我在我的主目录中运行以下命令时: egrep -r "main" * 它符合我的预期,并返回包含“main”的所有行和相应文件。

虽然如果我输入: egrep -r "main" 忘了把明星放在最后,它似乎只是永远地挂了。 我希望有人能够阐明为什么会这样做以及它在做什么?

谢谢:)

3 个答案:

答案 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"< - 从管道中搜索数据