bash non-greedy grep 2つのフレーズ間

bash non-greedy grep 2つのフレーズ間

リモートサーバーにデータを送信するためにカールコマンドを実行しています。コマンドの一部は、--trace-asciiカールの完全な出力を示しています。

公開されたデータのみを取得するようにこの出力をgrepしようとしています。

以下は出力の例です。x-www-form-urlencoded最初の発生からすべてをキャプチャしたいと思います。<= Recv SSL data

009c: Content-Length: 89
00b1: Content-Type: application/x-www-form-urlencoded
00e2: 
=> Send data, 89 bytes (0059)
0000: site=test&user=admin&description=Loca
0040: l system&location=NWE&site_id=67876&tel
0080: ephone=xxxxxx
== Info: upload completely sent off: 89 out of 89 bytes
<= Recv SSL data, 5 bytes (0x5)
0000: ....J
<= Recv SSL data, 1 bytes (0x1)
0000: .
== Info: TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
<= Recv SSL data, 57 bytes (0x10)

私が使用するコマンドは次のとおりです。 echo $OUTPUT | grep -Po '(?<=(x-www-form-urlencoded)).*(?= <= Recv SSL data)'

正しい位置から始まるデータを返しますが、以下を含むすべての行も含めます。<= Recv SSL data

私の考えでは:

x-www-form-urlencoded
00e2: 
=> Send data, 89 bytes (0059)
0000: site=test&user=admin&description=Loca
0040: l system&location=NWE&site_id=67876&tel
0080: ephone=xxxxxx
== Info: upload completely sent off: 89 out of 89 bytes

どうすればいいですか?

ありがとう

直す。以下は、使用されるカールコマンドの例です。

OUTPUT=`curl -u user:passwprd -s  \
    -d "site=test" \
    -d "user=admin" \
    -d "description=Local system" \
    -d "location=NWE" \
    -d "site_id=67876" \
    -d "telephone=xxxxxx" \
--trace-ascii - -XPOST "https://x.x.x.x/test.php"`

公開されたデータをキャプチャしたいです。

ベストアンサー1

一般的な質問は次のとおりです。貪欲な数量者。それをaに.*?置き換えると.*うまくいきます。

echo $OUTPUT |  grep -Po '(?<=(x-www-form-urlencoded)).*?(?=<= Recv SSL data)'

しかし、私はあなたのgrepがあなたにとってとてもうまくいったことに驚きました。 grepは1行ずつ動作するため、どんなものとも一致しないと予想されます。

おすすめ記事