リモートサーバー上のファイルから1行をjqする方法は?

リモートサーバー上のファイルから1行をjqする方法は?

リモートサーバーの特定の行を確認したいです。これまでファイルが存在するかどうかを確認できます。しかし、jqのようなツールを使って特定の行にインデックスを付けることはできますか?

if ssh -q -i $pathToPem $sshUsernameIp [ -f ${remote_serial} ];

        then

            echo "Serial number is found externally"
            serialNumber=$(cat serialNumber.json | jq '.serialNumber')

            if ssh -q -i $pathToPem $sshUsernameIp [ "$serialNumber" == "${remote_serial | jq '.serialNumber'}" ];
                then
                    echo "Serial number is same"
                else
                    echo "Serial number is not same"
            fi
fi

出力>

Serial number is found externally
./test.sh: line 127: ${remote_serial | jq '.serialNumber'}: bad substitution

{} 内部に変数を渡すには? scpを使用せずにこれらのローカルファイルとリモートファイルを比較できますか?

ベストアンサー1

仕事を複雑にする必要はありません。リモートホストからJSONをインポートしてjq渡し、ローカルで同じことを行います。それから比較しなさい。リモートファイルが失われるとエラーが発生し(廃棄可能)、シリアル番号が異なるように比較されます(ローカルのシリアル番号も失われない限り)。

r_serial=$( ssh -q -i "$pathToPem" "$sshUsernameIp" cat "$remote_serial" 2>/dev/null | jq -r '.serialNumber' )
l_serial=$( jq -r '.serialNumber' serialNumber.json )

if [ "$r_serial" = "$l_serial" ]; then
    echo 'same'
else
    echo 'different (or missing)'
fi

これが$remote_serialリモートシステム上のJSONドキュメントのパス名であるとします。

また、呼び出し時の変数拡張への参照も参照してくださいssh


発生する実際のエラーは、次の事実に由来します。

"${remote_serial | jq '.serialNumber'}"

有効な変数拡張ではありません。次のようなものを使用したい場合があります。

"$( printf '%s\n' "$remote_serial" | jq '.serialNumber' )"

ただし、これは$remote_serialJSONドキュメントの内容が含まれていると仮定します。

おすすめ記事