从日志到 csv 获取值



我无法通过脚本将列中的变量数超过 4 个放入我的 csv 文件中

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
...
...

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

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

转义字符或类似的东西需要用于两位数 (10+( 的数字?

编辑:预期输出

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

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

sed 中的有效反向引用是12、...、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

一个在 awk。在缺少预期输出的情况下,这可能是您想要的,也可能不是您想要的

$ awk '
/SomeText/ {                                     # $3~/^SomeText/ maybe?
for(i=5;i<=15;i+=2) {                        # fields $5,$7,$9,...,$15
split($i,a,"/")                          # split by /
b=b (b==""?"":OFS) a[1]*4294967296+a[2]  # calculate some, buffer to b
}
print b                                      # print buffer
b=""                                         # reset buffer
}' file

输出:

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

最新更新