以下是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/stdin
)grep
,这是管道的工作。
当grep
没有给出文件名时,由于从标准输入获取输入,因此就文件而言,您的命令将会成功。
你可以这样想:
grep 'pattern' /dev/stdin
grep
您可以单独使用(不需要)获得所需的输出awk
:
% xrandr | grep -Po '^[^ ]+(?= connected)'
LVDS1
这将获得该行中第一个以空格分隔的单词(^[^ ]+
),后跟一个空格,然后是单词connected
((?= connected)
是一个零宽度正向前瞻模式,确保<space>connected
在所需部分后匹配)。