从日志获取值到csv

问题描述 投票:0回答:1

我在通过脚本将csv文件中的列中的变量多于4时遇到问题

cat $1 |
grep "SomeText" |
sed -e "s/^.*var1: \([0-9]*\)\/\([0-9]*\), var2: \([0-9]*\)\/\([0-9]*\), var3: \([0-9]*\)\/\([0-9]*\), var4: \([0-9]*\)\/\([0-9]*\), var5: \([0-9]*\)\/\([0-9]*\), var6: \([0-9]*\)\/\([0-9]*\).*/\1 \2 \3 \4 \5 \6 \7 \8 \9 \10 \11 \12/g" | 
awk "{ printf(\"%d;%d;%d;%d;%d;%d\\n\", 
    \$1*4294967296+\$2, 
    \$3*4294967296+\$4, 
    \$5*4294967296+\$6, 
    \$7*4294967296+\$8,
    \$9*4294967296+\$10,
    \$11*4294967296+\$12); }" > $1.csv

从类似的日志中

...
...
19/10/17 11:10:54 SomeText: var1: 0/1538614, var2: 0/1544404, var3: 0/99989, var4: 0/1312988, var5: 0/1312988, var6: 0/1212940
19/10/17 11:10:55 SomeText: var1: 0/2338726, var2: 0/2344516, var3: 0/899999, var4: 0/2113073, var5: 0/2113073, var6: 0/2012977
...
...

前四个变量很好,所有var1值都存储到第一列,var2值存储到第二列,依此类推。问题从第五个var开始。我不知道该如何解决,但我认为问题出在脚本的这一部分

.*/\1 \2 \3 \4 \5 \6 \7 \8 \9 \10 \11 \12

需要在具有两位数字(10+)的数字上使用转义字符或类似的字符吗?

感谢任何帮助或建议,谢谢。

regex bash
1个回答
0
投票

sed中的有效后备引用是\1\2,...,\9。您尝试使用\10 \11 \12无效,例如\10被解释为\1,后跟文字0

您需要使用功能更强大的工具来代替您的工具,例如Perl:

perl -ne '(@groups = m/: ([0-9]*)\/([0-9]*)/g) && print(join(" ", @groups), "\n")'

给出您的输入示例,这将产生如下所示的行:

0 1538614 0 1544404 0 99989 0 1312988 0 1312988 0 1212940
0 2338726 0 2344516 0 899999 0 2113073 0 2113073 0 2012977

[此外,在同一管道中使用grepsedawk是可疑的,因为所有这些工具都具有过滤和流编辑功能,并且其中功能最强大的功能通常可以以较低的开销(运行的进程更少)来执行功能较弱的功能。

一些例子:

  • [grep foo | sed -e 's/.../.../'应替换为sed -e '/foo/s/.../.../'
  • [grep foo | awk '{ ... }'应替换为awk '/foo/ { ... }'

  • [cat filename | grep pattern应替换为grep pattern filename

© www.soinside.com 2019 - 2024. All rights reserved.