【发布时间】:2010-09-14 15:17:45
【问题描述】:
我目前正在编写一个简单的 .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 错误的消息对于每个正在使用的邮件服务器都不同。我正在编制一个常见的列表)
【问题讨论】:
-
原始日志文件中有一行吗?
-
我必须审查它(那里的敏感数据),但这里有一个:2008-09-28 04:50:43 1KisKj-0000tX-L0 == james.o'stuff@domain .org
路由延迟(-51):未达到重试时间 -
如果你提供一个经过清理的示例文件(几行代码)和所需的输出,我将是你可以获得十几个免费的 perl、python 和 ruby 解决方案,这些解决方案比这简单得多.
-
您是否尝试从匹配 'o' 的每一行中获取 20-33 个字符?
-
啊,你是对的。我刚刚意识到第 20-33 行的概念是从我正在编写的类似脚本中继承而来的,该脚本是针对较长行的错误而设计的。我会尝试扩大它的边界。