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

ust*_*tun 0 bash awk

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

awk '/05\/May\/2012/ { print $0;}' /var/log/nginx/access.log  
Run Code Online (Sandbox Code Playgroud)

我想要做的是使用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
Run Code Online (Sandbox Code Playgroud)

但是,这在awk上失败了:

 awk: 1: unexpected character '''
Run Code Online (Sandbox Code Playgroud)

看起来我需要逃避一些变量,但到目前为止我还没有找到解决方案.

dog*_*ane 6

最好使用awk的变量赋值功能将shell变量传递给awk.然后~用来匹配模式.例如:

search_string="$j/$i/$h"
awk -v pattern="${search_string}" '$0 ~ pattern {print $0}' /var/log/nginx/access.log  
Run Code Online (Sandbox Code Playgroud)

这是awk手册中指定的推荐方法.