我试图按日期解析一些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 '''
似乎我需要逃避一些变量,但到目前为止我还没有找到解决方案。
答案 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