2012-05-09 37 views
0

我想按日期來分析一些nginx的日誌。我已經寫了一個awk oneliner找到所有匹配的日誌一天,如:循環在bash準備awk的輸入語句

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 ''' 

好像我需要逃避一些變數,但我還沒有找到一個解決辦法爲止。不需要

+0

打印$ 0不是必需的,因爲它是默認操作。 – jordanm

+0

爲什麼不把整個事情寫入AWK? –

+1

請注意,awk不會對引號做任何特殊處理 - 引號(單引號和雙引號)是將單詞組合爲單元的shell機制。 –

回答

2

單引號。需要 雙引號。

search_string="/${j}\/${i}\/${h}/ { print \$0;}" 
awk "$search_string" /var/log/nginx/access.log 
6

這是更好地使用awk的變量賦值功能shell變量傳遞到awk的。然後使用~來匹配模式。例如:

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

這是在awk manual中指定的推薦方法。

3

這裏是一個AWK腳本您的整個腳本:

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

如果你需要開始和done標誌,這些可以添加。