カールコマンドパラメータを含むテキストファイルがあります。ファイルの外観は次のとおりです。
'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
特定のテキストがある場合は、電子メールを受信できるように、上記のコマンドの出力を別のコマンドにパイプまたは送信します。値そのカールコマンドに使用し、ログファイルに書き込むか、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")]] }'