0

いくつかのnginxログを日付で解析しようとしています。私はawkonelinerを作成して、次のように1日の一致するすべてのログを検索しました。

awk '/05\/May\/2012/ { print $0;}' /var/log/nginx/access.log  

私がやりたいのは、bashを使用して数日から数か月にわたってループすることです。これが私が持っているものです

#!/bin/bash

for h in 2012
do
    for i in Apr May
    do
        for j in 01 02 03 04 05
        do
            echo "/${j}\/${i}\/${h}/"
            search_string="'/${j}\/${i}\/${h}/ { print \$0;}'"
            echo $search_string;
            awk $search_string /var/log/nginx/access.log  
            echo "${h} ${i} ${j} done" 
        done
    done
done

ただし、これはawk行で次のように失敗します。

 awk: 1: unexpected character '''

いくつかの変数をエスケープする必要があるようですが、これまでのところ解決策は見つかりませんでした。

4

3 に答える 3

6

シェル変数をawkに渡すには、awkの変数割り当て機能を使用することをお勧めします。次に、を使用~してパターンを一致させます。例えば:

search_string="$j/$i/$h"
awk -v pattern="${search_string}" '$0 ~ pattern {print $0}' /var/log/nginx/access.log  

これは、 awkマニュアルで指定されている推奨方法です。

于 2012-05-09T13:09:34.260 に答える
3

1つのAWKスクリプトに含まれるスクリプト全体を次に示します。

awk 'BEGIN {
         years = "2012"
         months = "Apr|May"
         days = "01|02|03|04|05"
     }
     $0 ~ days "/" months "/" years {
         print
     }' /var/log/nginx/access.log

開始マーカーと完了マーカーが必要な場合は、それらを追加できます。

于 2012-05-09T15:07:22.487 に答える
2

一重引用符は必要ありません。二重引用符が必要です。

search_string="/${j}\/${i}\/${h}/ { print \$0;}"
awk "$search_string" /var/log/nginx/access.log
于 2012-05-09T13:05:07.977 に答える