총 길이 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라는 두 개의 파일을 생성해야 합니다.

답변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")]] }'

관련 정보