複数のシェルコマンドがあり、xargs
一緒に処理できるように同じインスタンスにパイプしたいと思います。
ファイルとグローバル式の2つの入力があります。
$ cat subdomains.txt
admin.site.com
web.site.com
api.site.com
$ ls -d x*
xab xac xad
私はこれを次のようにしたいと思います:
admin.site.com:xab
admin.site.com:xac
admin.site.com:xad
web.site.com:xab
web.site.com:xac
web.site.com:xad
api.site.com:xab
api.site.com:xac
api.site.com:xad
私が試したコマンドは次のとおりです(動作しません)。
cat subdomains.txt | ls -d x* | xargs -I value1,value2 echo 'value1:value2'
答え1
GNUを使用してこれを行うことができますparallel
。
$ printf '%s\n' x* | parallel echo "{1}:{2}" :::: subdomains.txt :::: -
admin.site.com:xab
admin.site.com:xac
admin.site.com:xad
web.site.com:xab
web.site.com:xac
web.site.com:xad
api.site.com:xab
api.site.com:xac
api.site.com:xad
答え2
醜いアプローチが必要です。eval
中かっこ拡張は通常変数拡張の前に行われるため、2 回の評価が必要です。
sub=$( paste -sd, subdomains.txt )
xs=$( ls -d x* | paste -sd, )
eval "printf '%s\n' {$sub}:{$xs}"
より良い方法:各個々のステップの結果を配列に保存し、入れ子になったループを使用して結合します。
mapfile -t sub < subdomains.txt
xs=( x* )
for s in "${sub[@]}"; do
for x in "${xs[@]}"; do
echo "$s:$x"
done
done
答え3
$ printf '%s\n' x* | join -t : -1 2 -2 2 -o 1.1,2.1 subdomains.txt -
admin.site.com:xaa
admin.site.com:xab
admin.site.com:xac
web.site.com:xaa
web.site.com:xab
web.site.com:xac
api.site.com:xaa
api.site.com:xab
api.site.com:xac
これは、ファイルにリストされているドメインと、現在のディレクトリの文字で始まるファイル名とのjoin
間に一種の外積を生成するために使用されます。subdomains.txt
x
交差積は、join
存在しないフィールド(列2、-1 2
およびで指定)-2 2
に2つのデータセットを結合するように要求することによって生成されます。また、入力フィールドと出力フィールドの区切り文字を:
withに指定-t :
し、各ファイルから最初の列を取得するには明示的に使用する必要があります-o 1.1,2.1
(そうでない場合は、結果から空の最初の列が得られます)。
答え4
printf '%s\n' x*
ファイルが32,000以上の場合にのみ必要です。
それ以外の場合は、次のように動作します。
parallel mytool.sh --parm1 {1} --parm2 {2} :::: subdomains.txt ::: x*
1枚+2枚読むhttp://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html(ダウンロードは以下のサイトで可能です。https://doi.org/10.5281/zenodo.1146014)。あなたのコマンドラインはあなたを愛するでしょう。
(x*
ファイルが次からインポートされた場合は、第split
9章も読んでください。
parallel -a bigfile --block 10M --pipepart --argsep ,, -I ,, parallel --pipe --tee wc {} ::: -l -c -w
)。