从man grep
页面(在Debian上):
描述
grep searches the named input FILEs (or standard input if no files are
named, or if a single hyphen-minus (-) is given as file name) for lines
containing a match to the given PATTERN. By default, grep prints the
matching lines.
在第一种情况下,grep
打开文件;在第二个步骤中,shell打开文件并将其分配给的标准输入grep
,并且grep
不传递任何文件名参数就假定它需要grep其标准输入。
1的优点
grep
可以复制多个文件¹。
grep
可以显示每次line
找到的文件名。
优点2:
在性能方面,如果无法打开文件,则可以grep
在使用重定向时保存的执行,但是对于grep
我来说,我希望不会有太大的区别。
使用重定向,您无需将额外的参数传递给grep
,从而使grep
的参数解析稍微容易一些。另一方面,shell将需要(至少)dup2()
对文件描述符的额外系统调用到文件描述符0上。
在中{ grep -m1 line; next command; } < file
,grep
(此处为GNU grep
)将要seek()
返回到匹配行之后,以便next command
看到文件的其余部分(它还需要确定文件是否可搜索)。换句话说,stdin中的位置是的另一个grep
输出。使用grep -m1 line file
,它可以优化性能,这是您无需担心的另一件事grep
。
笔记
¹使用zsh
,您可以执行以下操作:
grep line < file1 < file2
但这等效于cat file1 file2 | grep line
(不调用cat
实用程序),因此效率较低,如果第一个文件未以换行符结尾并且不会让您知道在哪个文件中找到了模式,则可能引起混乱。
²在的情况下,ksh93
和bash
虽然有像文件 /dev/tcp/host/port
(并/dev/fd/x
在某些系统bash
),在重定向的目标使用时,特殊用途,而不是真正打开文件系统上的文件外壳拦截(虽然一般,这些文件在文件系统上不存在)。/dev/stdin
的作用与-
识别的目的相同grep
,但至少在这里它具有更正确的命名空间(任何人都可以-
在任何目录中创建一个名为的文件,而只有管理员可以创建一个名为的文件,/dev/tcp/host/port
并且管理员应该了解更多)。