awkでスペースと引用符を区切り文字として使用します。

awkでスペースと引用符を区切り文字として使用します。

するとき

grep index.html /var/log/apache2/other_vhosts_access.log | awk '{print $1 $13}'

デフォルトでは、スペース区切り文字があります。

"と区切り文字の両方を使用する方法

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"

awkたとえば、?を使用してIPとユーザーエージェントを取得できます。

使ってawk -F'["]'もあまり効果はないようです。

予想される構文解析は次のとおりです。

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

役割クラスにスペースを含める必要があります。

echo 'word1 word2"word2 word4"word5' | 
    awk -F '[ "]'  '{ for (i = 1; i <= NF; ++i) { print $i } }'

答え2

IPアドレスとユーザーエージェントが必要です。

IPアドレスは、スペースで区切られた2番目の単語です。デフォルトとして存在します$2awkFS

ユーザーエージェントは、文字列の最後の二重引用符部分文字列です。最後の二重引用符を削除してから、最後の二重引用符まですべての項目を削除します。

そしてawk

awk '{ ip = $2; sub("\"$",""); sub(".*\"",""); ua = $0; print ip; print ua }'

または少し短く、

awk '{ ip = $2; sub("\"$",""); sub(".*\"",""); print ip; print }'

そしてsed

sed -e 'h' -e 's/[^ ]* //;s/ .*//p' \
    -e 'g' -e 's/"$//;s/.*"//'

まず、予約済みスペース(h)に行を保存し、(現在)最初のスペースまで削除してIP番号を抽出します。これにより、印刷されたIP番号が隔離されます。次に、保存された行(g)を検索し、コードと同じプロセスを適用しますawk。つまり、最後の二重引用符を削除してから、(現在)最後の二重引用符まですべてを削除します。

どちらのコマンドも、1行にIP番号を印刷し、次の行にユーザーエージェント文字列を印刷します。

関連情報