我有包含curl 命令参数的文本文件。这就是文件的样子
'https://example.com/tl/' -X POST -H 'Content-Type: application/json' --data-raw '{"email":"username2",}'
'https://example.com/tl/' -X POST -H 'Content-Type: application/json' --data-raw '{"email":"username3",}'
'https://example.com/tl/' -X POST -H 'Content-Type: application/json' --data-raw '{"email":"username4",}'
'https://example.com/tl/' -X POST -H 'Content-Type: application/json' --data-raw '{"email":"username5",}'
'https://example.com/tl/' -X POST -H 'Content-Type: application/json' --data-raw '{"email":"username6",}'
这是我使用的命令
cat /AbsolutePath/Inputfile.txt | xargs -P 10000 -n 10 curl -s | jq '.message'
我在用着杰克, 在命令行中解析json
我想要的是,
- 将上述命令的输出通过管道传输或发送到另一个命令,以便如果
message
有特定文本,则抓取电子邮件价值在相应的curl命令中使用并写入日志文件或使用usernameX.txt创建文件名
例如,仅当 username2 和 username5 cURL 命令的消息 = 'success' 时,才应将这两个用户名写入日志文件或创建两个文件 username2.txt 和 username5.txt。
答案1
为了满足您的要求,输出的每条“消息”都需要与其对应的输入“邮件”相关联。
最简单的方法可能是将curl 替换为您自己的shell 脚本,该脚本可以输出给定的邮件及其curl 结果。一个简单的、不安全的版本可能是这样的
#! /bin/bash
# print <mail> <message>
jq .mail -rj "${@: -1]}" # print mail without newline
echo -n " "
curl -s "$@" | jq .message -r
然后将结果通过管道传输到awk '$2=="success"{print $1}'
除此之外,你可以尝试这个
cat /AbsolutePath/Inputfile.txt |
xargs -P 10000 -n 10 curl -s |
jq -s 'to_entries|.[]|select(.value.message=="success")|.key+1' |
awk 'FILENAME=="-"{line[$0]=1} FILENAME != "-" && line[FNR]==1{print gensub(/.*--data-raw /, "", "g", $0)}' - /AbsolutePath/Inputfile.txt |
jq .mail -r
基本上,jq 获取成功消息的索引,awk 读取索引并从文件中检索相应第 n 行的最后部分。
答案2
建议使用简单的awk
脚本。
awk 脚本
awk '{system("curl "$0)}' /AbsolutePath/Inputfile.txt | jq
awk脚本过滤成功消息
awk '{system("curl "$0)}' /AbsolutePath/Inputfile.txt | grep "success"
答案3
总长DR
cat input.txt |
xargs -P0 -L1 sh -c 'curl -s "$@" | jq -c --arg username $(echo "${@: -1}" | jq -r .email) "{\$username, message}"' sh |
jq -r 'select(.message == "success") | .username'
如何
您请求根据相应的响应正文打印用户名,但您的输入文件由curl
参数组成,并且您没有提及响应正文是否包含用户名。
因此,我决定解析您的最后一个参数以首先获取用户名,例如:
cat input.txt |
xargs -P0 -L1 sh -c 'curl -s "$@" | jq -c --arg username $(echo "${@: -1}" | jq -r .email) "{\$username, message}"' sh
{"username":"username2","message":"failure"}
{"username":"username4","message":"failure"}
{"username":"username3","message":"success"}
{"username":"username5","message":"failure"}
{"username":"username6","message":"success"}
检索到由用户名和消息对组成的 JSON 对象列表后,我们可以通过以下命令轻松过滤 Steam:
jq -r 'select(.message == "success") | .username'
cat input.txt |
xargs -P0 -L1 sh -c 'curl -s "$@" | jq -c --arg username $(echo "${@: -1}" | jq -r .email) "{\$username, message}"' sh |
jq -r 'select(.message == "success") | .username'
username3
username6
仅供参考,这里是我用于调试的 Ruby HTTP 服务器。
rackup -rjson -b 'run ->(_) { [200, {}, [JSON.dump(message: rand(2) == 0 ? "success" : "failure")]] }'