Mad*_*vad 3 pipe io-redirection
我发现自己总是必须在命令行中向上箭头并向后移动,以更改先前命令的一部分,该部分会被转移到稍后的命令grep
或head
其他命令。
举一个简单的例子:搜索dmesg
给定的字符串并且只想要最后 5 个出现的字符串。
我会这样做:
dmesg | grep -i USB | tail -n 5
Run Code Online (Sandbox Code Playgroud)
但如果我想更改搜索词或我正在搜索的内容或来源,我会等待光标回溯到该行的相关部分。我想将其移至行尾,以便上面的示例可以表示为(我知道这是不正确的):
tail -n 5 < dmesg | grep -i USB
(然后我可以搜索sda
)
正如我所说,这是一个粗略的例子,表明了我想做的事情,但实际上并不是我想做的事情,即。这不是关于anddmesg
的使用,而是如何在这些程序之间进行交互,并将“变量”放在末尾。grep
tail
这可以进一步以获取 DNS 查询的查找时间为例:
dig google.com | grep msec
(让我们移动google.com
到最后,以便我可以测试另一个域)通过
grep msec < dig google.com
再次,糟糕的例子。我更多地讨论的是当我在多个程序之间有输入/输出流动时
我承认我对管道和重定向只有基本的了解,可以总结为:
|
)使用stdout
一个程序的输入到stdin
另一个程序的 输入>
)获取stdout
一个程序的并将其输入到一个文件中(旁白:除了我能想到的唯一明显的程序之外,它是否可以重定向到其他地方,> /dev/null
或者> /dev/sda
或者> {said file}
<
) (我称之为“文件作为输入”)获取文件的内容并使用它们,就像在命令行中键入它们一样在支持<()
(bash、ksh、zsh)的shell中,您可以转换
$ cmd1 | cmd2
Run Code Online (Sandbox Code Playgroud)
进入
$ cmd2 < <(cmd1)
Run Code Online (Sandbox Code Playgroud)
这两者在管道方面应该是等效的。(但是,我认为这两种形式在处理进程组和信号等事务的方式方面存在一些细微差别)。
为了更好地进行命令行编辑,我建议您探索 shell 的工具。例如,bashset -o vi
允许您使用类似 vi 的快捷方式或vim
直接切换到更有效地编辑命令。默认set -o emacs
使用 emacs 快捷方式(搜索man bash
readline 以了解有关它们的更多信息 ( /readline
))。