循环使用bash来准备awk的输入语句

时间:2012-05-09 12:49:13

标签: bash awk

我试图按日期解析一些nginx日志。我写了一个awk oneliner来查找一天的所有匹配日志,例如:

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

似乎我需要逃避一些变量,但到目前为止我还没有找到解决方案。

3 个答案:

答案 0 :(得分: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中指定的推荐方法。

答案 1 :(得分: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

如果您需要开始和完成标记,可以添加标记。

答案 2 :(得分:2)

不需要单引号。 需要双引号。

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