我有一个日志文件,我需要在服务器上“重播”。
它包含以下条目:
Request:
query: EXEC prc_insert_customer
@param0: 110040851
@param1: 137463
@param2: user@example.com
@param3: John
@param4: Smith
@param5: Some address
@param6:
@param7:
@param8: Some city
@param9: GBR
@param10: POSTCODE
@param11: (555) 123-45-67
Response:
...
我需要将每个块转换为
EXEC prc_insert_customer '110040851', '137463', ..., '(555) 123-45-67'
我尝试使用awk:
/EXEC prc_insert_customer/ {
str = "EXEC prc_insert_customer";
}
str && /@param/ {
if ($1 == "@param0:")
sep = ""
else
sep = ","
str = ((str) (sep) " '"($2) ("'"))
}
/^Response/ {
if (str)
print str
str = ""
}
但我得到的输出是:
', '(555)'DE', '', 'Some', 'GBR0851
如何获得正确的输出?
我在GNU Awk 4.0.0
上使用Fedora 17
。
答案 0 :(得分:2)
这段代码的细微变化可以解决这个问题:
BEGIN { processing = 0 }
/^Request/ { processing = 1 }
/^Response/ { processing = 0 }
{
if (! processing)
next
if ($1 ~ /^@param/)
{
sep = ($1 == "@param0:" ? "" : ", ")
rest = "'"
for (i = 2; i <= NF; ++i)
rest = rest (i == 2 ? "" : " ") $i
rest = rest "'"
str = str sep rest
}
else if (str != "")
{
print "EXEC prc_insert_customer", str
str = ""
}
}
这为我打印:
EXEC prc_insert_customer '110040851', '137463', 'user@example.com', 'John', 'Smith', 'Some address', '', '', 'Some city', 'GBR', 'POSTCODE', '(555) 123-45-67'
在Mac OSX上使用awk version 20070501
和GNU Awk 4.0.0
进行了测试。
答案 1 :(得分:2)
如果基于Windows的日志文件,那么你几乎肯定会处理邪恶^ M char的副作用(影响?; - &gt;)。它可以在您描述时彻底产生问题。
sub(/^M/,"", $0)
应该有帮助。
这是一个真正的Ctrl-M字符,而不是2个字符'^','M',通过按Ctrl-V和Ctrl-M在符合vi的编辑器中生成。
我希望这会有所帮助。