在awk中连接字符串
我有一个需要在服务器上“重播”的日志文件 它包含如下条目:在awk中连接字符串,awk,Awk,我有一个需要在服务器上“重播”的日志文件 它包含如下条目: Request: query: EXEC prc_insert_customer @param0: 110040851 @param1: 137463 @param2: user@example.com @param3: John @param4: Smith @param5: Some address @pa
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
如何获得正确的输出
我在
Fedora 17
上使用GNU Awk 4.0.0
,对这个代码片段稍加修改即可:
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 = ""
}
}
使用Mac OSX上的
awk版本20070501
和GNU awk 4.0.0
进行测试。如果日志文件基于Windows,则几乎可以肯定您正在处理邪恶^M字符的副作用(影响?;->)。正如你所描述的,它肯定会产生问题
sub(/^M/,"", $0)
应该有帮助
这是一个真正的Ctrl-M字符,而不是按Ctrl-V和Ctrl-M在符合vi标准的编辑器中生成的两个字符“^”和“M”
我希望这有帮助。它输出记录行,后跟
,(555)123-45-67omstomer 110040851
编辑后,输出略有变化:,'(555)123-45-67tyomer'110040851
。仍然以日志行作为前缀。使用方便的/from/,/to/
语法时,似乎无法避免打印输入行。新版本不会向我打印任何内容。您使用的是哪个awk
版本?我使用awkversion20070501
和gnuawk4.0.0
对其进行了测试,并在这样调用时收到一致的输出:awk-f test.awk
。我会使用sub(/\r/,“”,$0)
,这样您的脚本中就不会出现混乱的断行。您也可以使用/\015/
。
sub(/^M/,"", $0)