0

我正在尝试按日期解析一些 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 '''

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

4

3 回答 3

6

最好使用 awk 的变量赋值功能将 shell 变量传递给 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

这是一个 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 回答