我正在尝试学习如何使用 xargs 操纵管道流量。很多时候,我需要将命令的输出输入到标准输出无法通过管道输入的命令中。
awk 似乎有一些等效项,当您使用它打印时,用符号 $0 表示整个标准输出,而 $1、$2 等是单独的字段,但我似乎在 xargs 中找不到等效项。
示例:类似这样:标准输出是一个无序的参数列表:
file.txt
:
secondfield firstfield thirdfield
secondfield2 firstfield2 thirdfield2
secondfield3 firstfield3 thirdfield3
我想运行如下伪代码:
cat file.txt | xargs myprogram $2 $1 $3
我的程序按照输入字段的顺序获取输入字段,其中应该是第一个字段,第二个字段,然后是第三个字段,但显然我的标准输出是乱序的。 $1 $2 $3 只存在于 awk 中。相当于什么?
(这只是一个简化的示例,但重点是我需要知道如何将我的标准输出流排序到 xargs 中,以防我需要操纵哪些变量在其他复杂命令中的位置(例如 mv)
答案1
如果你这样做:
cat file.txt | xargs myprogram
这就像myprogram
被称为:
myprogram secondfield firstfield thirdfield secondfield2 firstfield2 thirdfield2 secondfield3 firstfield3 thirdfield3
除非你的参数真的很长并且无法在命令行上传递。这不是你想要开始的。相反做
cat file.txt | xargs --max-lines=1 myprogram
将会myprogram
使用 3 个参数来调用,但字段的顺序错误。如果你不能改变myprogram
我会调用一个小Python程序:
#!/usr/bin/env python
import sys
import subprocess
sys.exit(subprocess.call('myprogram', sys.argv[2], sys.argv[1], sys.argv[3]))
通过以下方式:
cat file.txt | xargs --max-lines=1 mypythonprog
答案2
$ xargs -d '\n' -L1 sh -c 'set $1; echo $2 $1 $3' xx < file.txt
firstfield secondfield thirdfield
firstfield2 secondfield2 thirdfield2
firstfield3 secondfield3 thirdfield3