漏水検査出力で成功した値のみを選択する方法は?

漏水検査出力で成功した値のみを選択する方法は?

漏れ点検の結果、この結果が出ました。 「間違った」結果を正しく除外してbashを使用して電子メールを引き続き含める方法

[email protected]
{"success":false,"error":"Not found"}
 
[email protected]
{"success":false,"error":"Not found"}
 
[email protected]
{"success":false,"error":"Not found"}
 
[email protected]
{"success":true,"found":1,"passwords":1,"sources":[{"name":"LinkedIn.com","date":"2012-05"}]}
 
[email protected]
{"success":true,"found":1,"passwords":1,"sources":[{"name":"LinkedIn.com","date":"2011-05"}]} 

これはbash次のスクリプトによって生成されます。

#!/bin/bash
 
for i in $(cat $emails):
do echo $i; curl -s "https://leakcheck.io/api/public?key=<api-key>&check=$i"; echo; sleep 0.5; echo;
done

答え1

アドレスを出力して API を照会する代わりに、呼び出しが成功した場合にのみ、API 呼び出しのアドレスと結果が出力されます。

#!/bin/bash

while IFS= read -r addr; do
    reply=(
        curl --silent \
            --url-query key='<api-key>' \
            --url-query check="$addr" \
            'https://leakcheck.io/api/public'
    )

    if jq -e '.success' <<<"$reply"; then
        printf 'Address "%s":\n%s\n' "$addr" "$reply"
    fi
done <"$emails"

その後、表示されたファイルからアドレスを1つずつ読み、$emails各アドレスにAPIを照会します。返された JSON ドキュメントに false ではなく、NULL 以外の値を持つ最上位キーが含まれている場合、successAPI のアドレスと応答が印刷されます。成功したテストは、式でjq -e最後に評価された値に依存する値で終了することを使用して実行されますjq.successこの場合)。

API エンドポイントへのアクセス権がないため、このコードはテストされていません。


呼び出しjqは次のように書くこともできます。

jq -e -n --argjson reply "$reply" '$reply.success'

...非標準の「here-string」リダイレクトに依存しないため、/bin/sh代わりにスクリプトを実行できます。bash<<<

データをさらに処理するには、アドレスをJSONにマージする必要があります(やや奇妙なことに、このアドレスはまだAPIレスポンスの一部ではありません)。 JSONの処理は、テキストと構造化されたJSONオブジェクトを混在させて処理するよりも簡単で安全です。

#!/bin/sh

while IFS= read -r addr; do
    reply=(
        curl --silent \
            --url-query key='<api-key>' \
            --url-query check="$addr" \
            'https://leakcheck.io/api/public'
    )

    jq -n \
        --arg addr "$addr" \
        --argjson reply "$reply" \
        '$reply | select(.success) | .address = $addr'
done <"$emails"

これで、アドレスを出力するためにシェルを使用する必要がなくなり、このif文は不要になりました。代わりにselect()成功すると、応答から項目を取得し、キーを使用してオブジェクトにアドレスを追加しますaddress。これは、失敗した応答に対する出力がないことを意味します。

スクリプトの最後のバリエーションの出力例は次のとおりです。

{
  "success": true,
  "found": 1,
  "passwords": 1,
  "sources": [
    {
      "name": "LinkedIn.com",
      "date": "2012-05"
    }
  ],
  "address": "[email protected]"
}
{
  "success": true,
  "found": 1,
  "passwords": 1,
  "sources": [
    {
      "name": "LinkedIn.com",
      "date": "2011-05"
    }
  ],
  "address": "[email protected]"
}

きれいなJSONを出力として印刷したくない場合は、jq次のオプションを使用してください。-c

{"success":true,"found":1,"passwords":1,"sources":[{"name":"LinkedIn.com","date":"2012-05"}],"address":"[email protected]"}
{"success":true,"found":1,"passwords":1,"sources":[{"name":"LinkedIn.com","date":"2011-05"}],"address":"[email protected]"}

答え2

おそらく、grep "true"これはtrueを含むすべての行を表示します。理論的には、単にbashスクリプトに追加することもできます。

関連情報