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