Scripting Awk脚本帮助-逻辑问题

Scripting Awk脚本帮助-逻辑问题,scripting,awk,logic,Scripting,Awk,Logic,我目前正在编写一个简单的.sh脚本来解析Exim日志文件中匹配“o”的字符串。目前,在查看output.txt时,每行(606行)上都会打印一个0。我猜我的逻辑是错误的,因为awk不会抛出任何错误 这是我的代码(针对串联和计数器问题进行了更新)。编辑:我已经采纳了一些来自dmckee答案的新代码,为了简单起见,我现在正在使用这些代码 awk '/o'\''/ { line = "> "; for(i = 20; i <= 33; i++) {

我目前正在编写一个简单的.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
awk'/o'\''/{
行=“>”;

for(i=20;i
+
在awk中表示数字加法。如果要连接,只需将常量和/或表达式用空格分隔即可

那么这个

line += " " + $i
应该成为

line = line " " $i
编辑:Iff exim日志文件(我更喜欢后缀:)由一个空格分隔,以下不是更简单吗:

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

此处不需要grep。让awk为您选择匹配的行(并根据ΖΖΖΖΖΖΥ修复连接错误):

awk'/o'\''/{
行=“>”;
对于(i=20;i)“”在局部地区并不违法。参见第4.1.2节:

Local-part = Dot-string / Quoted-string

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

Atom = 1*atext
2821非局部定义元素的进一步参考,因此:

atext           =       ALPHA / DIGIT / ; Any character except controls,
                        "!" / "#" /     ;  SP, and specials.
                        "$" / "%" /     ;  Used for atoms
                        "&" / "'" /
                        "*" / "+" /
                        "-" / "/" /
                        "=" / "?" /
                        "^" / "_" /
                        "`" / "{" /
                        "|" / "}" /
                        "~"
换句话说,“.”在电子邮件localpart中是一个完全合法的不带引号的字符。现在,在你的网站上它可能不合法,但你不是这么说的


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

关闭任务,更简单的是:python

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

你有原始日志文件中的一行吗?我必须检查它(那里的敏感数据),但这里有一行:2008-09-28 04:50:43 1KisKj-0000tX-L0==james.o'stuff@domain.org如果您提供一个经过消毒的示例文件(几行)我希望您能得到一打免费的perl、python和ruby解决方案,这些解决方案比这简单得多。您是否试图从匹配“o”的每一行中获取20-33个字符?啊,您是对的。我刚刚意识到20-33行的概念是从我正在编写的类似脚本中继承过来的,它是针对lo错误设计的行。我将尝试扩展它的边界。我尝试了这个,在清除output.txt文件后,我仍然得到了一堆0。你是正确的。请参阅我对问题的最后评论,了解原因。我已相应地更新了我的代码。是的!它可以工作。我所要做的就是在采用您的代码后扩展for循环。在文件rath上使用直线awk呃,比通过grep和其他东西传递信息要简单得多。谢谢。
atext           =       ALPHA / DIGIT / ; Any character except controls,
                        "!" / "#" /     ;  SP, and specials.
                        "$" / "%" /     ;  Used for atoms
                        "&" / "'" /
                        "*" / "+" /
                        "-" / "/" /
                        "=" / "?" /
                        "^" / "_" /
                        "`" / "{" /
                        "|" / "}" /
                        "~"
import fileinput
for line in fileinput.input():
    if "'" in line:
        fields = line.split(' ')
        print "> ", ' '.join( fields[20:34] )