3番目と4番目の二重引用符の間の内容を印刷する方法

3番目と4番目の二重引用符の間の内容を印刷する方法

LinuxシステムのWebサービスにはいくつかのログがあります。ログは次のとおりです。

{"log":"[2023-03-09T06:39:10.669Z] \"GET /server/prod?blank=true HTTP/1.1\" 200 - 0 874 1 1 \"-\" \"-\" \"aaad-bbb-ccc-dd-eeeee\" \"example.com:22213\" \"172.16.2.1:10080\"\n","stream":"stdout","time":"2023-03-09T06:39:11.935831787Z"}

ご覧のとおり、二重引用符がいくつかあります。 3番目と4番目の二重引用符の間、および11番目と12番目の二重引用符の間にある内容を印刷する必要があります。これは私が次のようなものを手に入れたいということです。

"GET /server/prod?blank=true HTTP/1.1\"   "example.com:22213\"

私は内容だけに興味があります。私は気にしませ"\

答え1

使用jq、キー値を抽出してデコードできますlog

$ jq -r .log file
[2023-03-09T06:39:10.669Z] "GET /server/prod?blank=true HTTP/1.1" 200 - 0 874 1 1 "-" "-" "aaad-bbb-ccc-dd-eeeee" "example.com:22213" "172.16.2.1:10080"

これは本質的に空白文字をフィールド区切り文字として使用するヘッダーレスCSVレコードであるため、次のCSV認識ツールを使用できます。ミラーmlr)は2番目と12番目のフィールドを解析します。

$ jq -r .log file | mlr --csv -N --fs space cut -f 2,12
"GET /server/prod?blank=true HTTP/1.1" example.com:22213

より簡単に解析するには、TSV出力形式を使用できます。

$ jq -r .log file | mlr --c2t -N --ifs space cut -f 2,12
GET /server/prod?blank=true HTTP/1.1    example.com:22213

最初のフィールドには埋め込み区切り文字が含まれなくなったため、Millerは自動的に引用符を削除します。

--csvto(--c2t一緒に使用されるものと同じ)とfrom to(セットのみ)に注意してください。--icsv--otsv--fs--ifs入力する出力フィールド区切り記号ではなく、フィールド区切り記号).この場合、MillerはTSVとCSVを同じように処理するため(フィールドの区切り記号のみが異なる)に変更する--fs spaceと同じ効果が得られます。--ifs space --ofs tab

答え2

私の計算によれば、4番目と5番目の二重引用符の間にテキストが必要で、次に12番目と13番目の二重引用符の間にテキストが必要です。

sed -E 's/^([^"]*"){4}([^"]*")([^"]*"){8}([^"]*").*$/"\2   "\3/'

sedGNU、BSD、Busyboxなどの拡張正規表現をサポートするものを使用してください)

sed 's/^\([^"]*"\)\{4\}\([^"]*"\)\([^"]*"\)\{8\}\([^"]*"\).*$/"\2   "\3/'

(何でも使用sed)。

答え3

サンプルawkスクリプトがアクションを実行します。これは"文字をフィールド区切り文字として使用するため、最初のフィールド($1)は最初のフィールドの前の部分です"

awk -F\" '{print $5 " " $13}'

gsub()バックスラッシュも削除するには、スクリプトで次のように使用できます。

awk -F\" '{gsub(/\\/, ""); print $5 " " $13}'

関連情報