grep 做什么?

grep 做什么?

以下是grep来自GNU网站

grep在输入文件中搜索包含与给定模式列表匹配的行。当它在一行中找到匹配项时,它会将该行复制到标准输出(默认情况下),或者生成您使用选项请求的任何其他类型的输出。

我有一个经常使用的命令,它给出当前连接的监视器的名称:

xrandr | grep " connected " | awk '{ print$1 }'

我在这个命令中看不到任何文件或指向这些文件的链接,那么到底发生了什么?grep除了搜索文件之外,还用于其他用途吗?

答案1

man grep(重点是我的):

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.

来自GNU 文档(再次强调):

2.4 grep 程序

grep在指定的输入文件中搜索包含与给定模式匹配的行。默认情况下,grep 会打印匹配的行。名为的文件-代表标准输入。如果没有指定输入, 如果给出了指定递归的命令行选项,则grep搜索工作目录;否则,.grep搜索标准输入

xrandr在这种情况下,标准输入是连接到标准输出的管道。

grep在这种情况下是多余的;它awk可以自己完成工作:

xrandr | awk '/ connected /{print $1}'

答案2

当你这样做时:

xrandr | grep " connected "

您基本上是将 的标准输出(文件描述符 1,/dev/stdout)重定向xrandr到 的标准输入(文件描述符 0,/dev/stdingrep,这是管道的工作。

grep没有给出文件名时,由于从标准输入获取输入,因此就文件而言,您的命令将会成功。

你可以这样想:

grep 'pattern' /dev/stdin

grep您可以单独使用(不需要)获得所需的输出awk

% xrandr | grep -Po '^[^ ]+(?= connected)'
LVDS1

这将获得该行中第一个以空格分隔的单词(^[^ ]+),后跟一个空格,然后是单词connected(?= connected)是一个零宽度正向前瞻模式,确保<space>connected在所需部分后匹配)。

相关内容