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は自動的に引用符を削除します。
--csv
to(--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/'
(sed
GNU、BSD、Busyboxなどの拡張正規表現をサポートするものを使用してください)
sed 's/^\([^"]*"\)\{4\}\([^"]*"\)\([^"]*"\)\{8\}\([^"]*"\).*$/"\2 "\3/'
(何でも使用sed
)。
答え3
サンプルawk
スクリプトがアクションを実行します。これは"
文字をフィールド区切り文字として使用するため、最初のフィールド($1
)は最初のフィールドの前の部分です"
。
awk -F\" '{print $5 " " $13}'
gsub()
バックスラッシュも削除するには、スクリプトで次のように使用できます。
awk -F\" '{gsub(/\\/, ""); print $5 " " $13}'