awk脚本帮助 - 逻辑问题

时间:2008-10-01 19:55:44

标签: scripting awk logic

我目前正在编写一个简单的.sh脚本来解析Exim日志文件,找到匹配“o”的字符串。目前,在查看output.txt时,每条线上都会打印0(606行)。我猜我的逻辑是错的,因为awk不会抛出任何错误。

这是我的代码(针对连接和计数器问题进行了更新)。编辑:我已经从dmckee的回答中采用了一些新代码,我现在正在使用旧代码来支持简单性。

awk '/o'\''/ {
         line = "> ";
         for(i = 20; i <= 33; i++) {
           line = line " " $i;
         }
         print line;
    }' /var/log/exim/main.log > output.txt

有什么想法吗?

编辑:为了清楚起见,我在电子邮件地址中搜索“o”,因为'在电子邮件地址中是非法字符(在我们的数据库中,只显示带有o'前缀的名称)。

编辑2:根据评论请求,这是一个需要输出的消毒样本:

[xxx.xxx.xxx.xxx] kathleen.o'toole@domain.com <kathleen.o'toole@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] julie.o'brien@domain.com <julie.o'brien@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] james.o'dell@domain.com <james.o'dell@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] daniel_o'leary@domain.com <aniel_o'leary@domain.com> routing defer (-51): retry time not reached

我在循环中从20开始的原因是因为第20个字段之前的所有内容都只是我此处不需要的标准日志信息。我需要的只是来自IP及其他所有内容的解决方案(每个550错误的消息对于那里使用的每个邮件服务器都是不同的。我正在编译一个常见的邮件列表)

4 个答案:

答案 0 :(得分:3)

+表示awk中的数字加法。如果要连接,只需将常量和/或表达式用空格分隔。

所以,这个

line += " " + $i

应该成为

line = line " " $i
编辑: Iff exim日志文件(我更多的是Postfix :)被单个空格分隔,不是以下更简单:

grep -F o\' /var/log/exim/main.log | cut -d\  -f20-33 >output.txt

答案 1 :(得分:2)

这里没有真正需要grep。让awk为你选择匹配的行(并根据ΤΖΩΤΖΙΟΥ修复你的串联错误):

awk '/o'\''/ {
             line = "> ";
             for(i = 20; i <= 33; i++) {
               line = line " " $i;
             }
             print line;
        }' /var/log/exim/main.log > output.txt

当然,如果你在上面的提示中做到这一点,你最终需要一些奇怪的逃避。脚本更干净......


编辑:第一遍我错过了+ =问题...

还假设您在上面给出的行是部分的,因为它只有13个字段(默认字段是以空格分隔的)。

答案 2 :(得分:1)

“'”在当地部分不违法。来自RFC2821,第4.1.2节:

Local-part = Dot-string / Quoted-string

Dot-string = Atom *("." Atom)

Atom = 1*atext

2821对非本地定义的元素进一步引用RFC2822,所以:

atext           =       ALPHA / DIGIT / ; Any character except controls,
                        "!" / "#" /     ;  SP, and specials.
                        "$" / "%" /     ;  Used for atoms
                        "&" / "'" /
                        "*" / "+" /
                        "-" / "/" /
                        "=" / "?" /
                        "^" / "_" /
                        "`" / "{" /
                        "|" / "}" /
                        "~"

换句话说,“'”是一个在电子邮件localpart中具有完全合法的无名分。现在,它可能不合法在您的网站,但这不是您所说的。

很抱歉没有直接关注主题,但我想纠正你的断言。

答案 3 :(得分:1)

关闭任务,更简单:python。

import fileinput
for line in fileinput.input():
    if "'" in line:
        fields = line.split(' ')
        print "> ", ' '.join( fields[20:34] )