用于命令参数的Unix管道
我正在寻找有关如何使用管道传递标准输出作为其他命令的参数的见解.
例如,考虑这种情况: ls | grep Hello grep的结构遵循以下模式:grep SearchTerm PathOfFileToBeSearched.在我已经说明的情况下,将Hello一词视为SearchTerm,并将ls的结果用作要搜索的文件.但是,如果我想切换它怎么办?如果我希望ls的标准输出是SearchTerm,并且grep之后的参数是PathOfFileToBeSearched,该怎么办?在一般意义上,我想控制管道填充哪个参数与前一个命令的标准输出.这是可能的,还是取决于命令脚本(例如grep)的编写方式? 非常感谢你的帮助! 解决方法
基本上有两种选择:shell命令替换和xargs. Brian Agnew刚刚写过关于前者的文章. xargs是一个实用程序,它接受stdin并将其转换为要执行的命令的参数.所以你可以跑
ls | xargs -n1 -J % grep -- % PathOfFileToBeSearched 对于ls输出的每个文件,它将运行grep -e filename PathOfFileToBeSearched以在指定的另一个文件中输入由ls输出的文件名.这是一个不寻常的xargs调用;通常它用于在命令的末尾添加一个或多个参数,而在这里它应该在特定的位置添加一个参数,所以我使用-n和-J参数来安排它.更常见的用法是类似的 ls | xargs grep -- term 搜索ls输出的所有文件的期限.虽然当然如果你只想要当前目录中的文件,你可以更简单地没有管道: grep -- term * 同样在你的反向安排中, for filename in *; do grep -- "$@" PathOfFileToBeSearched done 有一个重要的xargs警告:ls生成的文件名中的空白字符不会处理得太好.为此,如果您有GNU实用程序,则可以使用find. find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 -n1 -J % grep -- % PathOfFileToBeSearched 使用NUL字符分隔文件名而不是空格 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |