コマンドラインからApacheログを解析する(複数の区切り文字を含むログ)

コマンドラインからApacheログを解析する(複数の区切り文字を含むログ)

/var/log/apache2/other_vhosts_access.logコマンドラインから各列の値をどのように解析してインポートできますか?

これは確かに非常に一般的な質問であり、私は前に試しましたawkしかし、次の理由で状況は思ったより単純ではありません。

  • スペースは区切り文字として使用されます。
  • 引用符内にない限り"Mozilla/5.0 (Windows NT 10.0; Win64;..."
  • []日付列の場合

Debian で設定された標準 Apache ロギングの例:

www.example.com:443 1.2.3.4 - - [01/Feb/2021:15:07:35 +0100] "GET /index.html HTTP/1.1" 200 8317 "https://www.example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36"

予想される解析では、次のいずれかの列を抽出できる必要があります。

www.example.com:443
1.2.3.4
-
-
[01/Feb/2021:15:07:35 +0100]
"GET /index.html HTTP/1.1" 
200 
8317 
"https://www.example.com/" 
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36"

ベストアンサー1

awkGNUの使用FPATそして、二重引用符内に内部二重引用符がないか、かっこ内に括弧がないとします。

awk -v FPAT='"[^"]*"|\\[[^]]*\\]|[^ ]*' '{ for(i=1; i<=NF; i++) print $i }' infile

正規表現は実際に一致します。char-X[not char-X]<zero-or-more-of-any-character-until>char-Xそれを見た。

から見た人間のawk

FPAT
レコードのフィールド内容を記述する正規表現です。設定すると、gawk は FS 値をフィールド区切り文字として使用するのではなく、フィールドが正規表現に一致するフィールドに入力を解析します。

おすすめ記事