我有这个命令行:
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
以换行符结束。