总长DR

总长DR

我有包含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

我想要的是,

  1. 将上述命令的输出通过管道传输或发送到另一个命令,以便如果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")]] }'

相关内容