コマンドラインをxargsにパイプ

コマンドラインをxargsにパイプ

次のコマンドラインがあります。

curl https://token-api/42 | awk '{ print $0 }'

次の出力が生成されます。

{"id":"PX-12345","expiresAtUtc":"2020-07-05T06:55:52","createdUtc":"2019-07-15T06:55:52"}

これはawk '{ print $0 }'改行文字が出力の末尾に追加されるようにするためです。

これで同じことをしたいのですが、users.csv代わりにユーザーID()のcsvリストに対して次のようなバリエーションを試しました42xargs

awk -F, '{print "curl https://token-api/$0 | awk \'''\''{ print $0 }\'''\''"}' < users.csv | xargs -P1 -I {} sh -c '{}'

これにより、次のエラーが発生します。

awk: cmd. line:1: warning: escape sequence `\'' treated as plain `''
awk: cmd. line:1: {
awk: cmd. line:1:  ^ unexpected newline or end of string

その部分を削除すると、xargs次の結果が表示されます。

curl https://token-api/$0 | awk '{ print $0 }'

xargs私の問題はそれを2回使用しているようですが、$0この問題を回避する方法がわかりません。

カールの出力に改行文字を追加する別の(より良い)方法がある場合は、それも役に立ちます。それはそれなしでうまく機能するからです。ただし、次のように無制限のJSONドキュメントの長いリストが出力として表示されます。

{"id":"PX-12345","expiresAtUtc":"...","createdUtc":"..."}{"id":"PX-12346","expiresAtUtc":"...","createdUtc":"..."}{"id":"PX-12347","expiresAtUtc":"...","createdUtc":"..."}

答え1

csvファイルの各行でコマンドを実行するよりも、カールマルチURL機能を利用する方が簡単です。

次のように中括弧内にサブセットを作成して、複数のURLまたはURLの一部を指定できます。http://サイト.{日,この,三}.com

あなたのcsvファイルがどのように見えるかわかりません。みんな一行になっていると思いますか?その場合、catカールコマンドでこのファイルを使用できます。

curl "https://token-api/{$(cat users.csv)}"

まだクリーンアップが必要です。

curl "https://token-api/{$(cat users.csv)}" 2>/dev/null | sed '1d;s/--_curl_--.*$//'; echo

このsedコマンドは最初のURLにすぎないため、最初の行を削除してから残りのURLを削除して、項目間に便利な改行を残します。最後にecho改行文字で終わります。

関連情報