2

我目前正在编写一个简单的 .sh 脚本来解析 Exim 日志文件中匹配“o”的字符串。目前,在查看 output.txt 时,每行(606 行)上都打印一个 0。我猜我的逻辑是错误的,因为 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

4 回答 4

3

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

所以这

line += " " + $i

应该成为

line = line " " $i

编辑:如果exim日志文件(我更喜欢 Postfix :) 由一个空格分隔,以下不是更简单:

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

?

于 2008-10-01T20:02:50.950 回答
2

这里不需要 grep。让 awk 为您选择匹配行(并根据 ΤZΩΤZΙΟΥ 修复您的串联错误):

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

当然,如果你像上面那样在提示符下这样做,你最终需要一些奇怪的转义。它在脚本中更干净......


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

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

于 2008-10-01T20:17:17.860 回答
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
                        "&" / "'" /
                        "*" / "+" /
                        "-" / "/" /
                        "=" / "?" /
                        "^" / "_" /
                        "`" / "{" /
                        "|" / "}" /
                        "~"

换句话说,“'”是一个完全合法的不带引号的字符,在本地电子邮件中具有。现在,它在您的网站上可能不合法,但您不是这么说的。

很抱歉没有直接讨论主题,但我想更正您的断言。

于 2008-10-01T20:30:42.867 回答
1

关闭任务,更简单:python。

import fileinput
for line in fileinput.input():
    if "'" in line:
        fields = line.split(' ')
        print "> ", ' '.join( fields[20:34] )
于 2008-10-01T21:01:22.403 回答