一些命令将文件作为输入,有没有办法将命令的结果视为文件?
例如我想获取两个字符串之间的一个字符串:
sed -n "/START-WORD-HERE/,/END-WORD-HERE/p" input
但是我想使用一个生成大量文本作为输入的命令,例如“cat somefile”,我尝试用$(cat somefile) 替换输入,但 sed 对 cat 命令返回的每个单词都返回了错误......
答案1
是的,这就是 Linux 哲学的核心“许多小工具组成一个更大的进程”
Linux 使用一种叫做命令行管道的东西。
要使用它们,只需使用竖线字符将两个命令连接在一起
|
因此,就您而言,您想将 cat 命令的输出发送到 sed 命令,您可以按如下方式执行此操作
cat somefile | sed -n "/START-WORD-HERE/,/END-WORD-HERE/p"
请注意,在这种情况下您不再在命令后指定文件名。
99% 的 Linux 命令都允许你使用管道进行操作,但一定要阅读其中一些命令的手册页,因为其中很多命令仍然需要你指定要使用的文件名,但通常会告诉你使用
-
(减号字符)
代替文件名。
还要记住,在大多数情况下,管道是线性的,一端的输出形成另一端的输入,并承载沿链执行的任何转换。
这意味着,例如,如果你
cat somefile | grep someword | sed -n "/START-WORD-HERE/,/END-WORD-HERE/p"
sed 的输入仅是 grep 对 cat 的输入执行的任何操作的输出。
最好先用文件的副本进行测试/试验,直到您知道一切正确为止,并且不要害怕一步一步地开发事情。
获取
cat blah | grep bleah
在添加 sed 位之前,确保位正确。然后在添加 awk/wc/ 或其他位之前确保 sed 位正确,一步一步地观察输出将允许您在进行过程中调试和验证管道。
有许多命令可以完成许多不同的工作,花一个晚上阅读几页 Linux 命令行工具手册是一个很好的借口。有工具可以从文件中剪切列、将 word 文档转换为文本、计算行数等等。
然后,一旦您对此感到厌倦,这里有一个链接,指向我很久以前为 PHP Builder 撰写的一篇文章,向您展示如何用 PHP 编写自己的管道处理器。
https://phpbuilder.com/php-and-shell-scripting-using-pipes/
最重要的是玩得开心,你可以用很少的工具做一些令人惊奇的事情。