将管道命令行传递给 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 }'是为了确保在输出末尾附加换行符。

现在我想做同样的事情,但是对于用户 ids ( users.csv) 的 csv 列表,而不是42使用xargs.所以我尝试了这个和一些变体:

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.我想我的问题是$0使用了两次,但我不知道如何逃避这个问题。

如果有另一种(更好的)方法将换行符附加到curl的输出中,这也可能有帮助,因为没有它它就可以正常工作。但是,然后我得到一长串未分隔的 JSON 文档作为输出,如下所示:

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

答案1

与对 csv 文件的每一行执行命令相比,利用curls 多 URL 功能可能更容易。

您可以通过在大括号内编写部分集来指定多个 URL 或 URL 的一部分,如下所示:http://站点.{一,二,三}.com

我不确定你的 csv 文件是什么样子的,似乎全部都在一行中?如果是这样,您可以只使用cat该文件并与curl 命令结合使用。

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以换行符结束。

相关内容