全長DR

全長DR

カールコマンドパラメータを含むテキストファイルがあります。ファイルの外観は次のとおりです。

'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特定のテキストがある場合は、電子メールを受信できるように、上記のコマンドの出力を別のコマンドにパイプまたは送信します。そのカールコマンドに使用し、ログファイルに書き込むか、usernameX.txtを使用してファイル名を作成します。

たとえば、cURLコマンドのメッセージ= '成功'の場合にのみ、ユーザー名2とユーザー名5をログファイルに書き込むか、ユーザー名2.txtとユーザー名5.txtという2つのファイルを作成する必要があります。

答え1

要件を満たすには、各出力「メッセージ」を対応する入力「メール」に関連付ける必要があります。

最も簡単な方法は、特定のメールとそのカール結果を出力できる独自のシェルスクリプトにカールを置き換えることです。シンプルで安全でないバージョンは次のとおりです。

#! /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")]] }'

関連情報