xargsを使用してパイプライントラフィックを操作する方法を学びます。標準出力をパイプできないコマンドでコマンドの出力をパイプしなければならないことがよくあります。
awkはそれを使用して印刷するとき、$ 0シンボルがstdout全体を表し、$ 1、$ 2などが別々のフィールドであるのと同等の機能を持っているようですが、xargsではそれに対応する項目が見つからないようです。
例: 次のようになります。標準出力は、順序付けされていない引数のリストです。
file.txt
:
secondfield firstfield thirdfield
secondfield2 firstfield2 thirdfield2
secondfield3 firstfield3 thirdfield3
次のように疑似コードを実行したいと思います。
cat file.txt | xargs myprogram $2 $1 $3
私のプログラムは、予想される順序で入力フィールドを取得します。最初のフィールド、2番目のフィールド、3番目のフィールドでなければなりませんが、標準出力の順序が間違っているようです。 $ 1 $ 2 $ 3はawkにのみ存在します。何と同じですか?
(これは単なる例ですが、要点は、他の複雑なコマンド(mvなど)でどの変数がどこにあるかを操作する必要がある場合は、stdoutストリームをxargsにソートする方法を知る必要があるということです。
答え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
3つの引数で呼び出されますが、myprogram
フィールドの順序が正しくありません。変更できない場合は、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