使用CLI将交错的日志行拆分为表格

让我们说一些日志行看起来像:

"OUT 2019.11.05D04:51:39.583193000 ### hostname ### [blah] From 127.0.0.1 - Some Stuff here: ' Fred@somewhere.com,james@elsewhere.com,Steve@Cabbage.com,75692,45263,99956,London,Sydney,Paris Some other Text ###"

上面有3个我想变成行的元素,但我不知道它可能包含多少个实际元素。

"OUT 2019.11.05D04:51:39.583193000 ### hostname ### [blah] From 127.0.0.1 - Some Stuff here: ' Fred@somewhere.com,Jane@doh.com,22321,Paris,Memphis Some other Text ###"

上面有4个元素,但实际上可以是大约30个任何数字

我想把这变成

Fred@somewhere.com  | 75692 | London
james@elsewhere.com | 45263 | Sydney
Steve@Cabbage.com   | 99956 | Paris
Jane@doh.com        | 99956 | Memphis

日志行两侧的粗字符总是具有相同的格式和字数,因此可以删除前13个字和后4个字。 结果列的数量是静态的,在最后一个示例中为3,而在实际示例中更多。

我想要一个函数,可以将日志文件的尾部输送到管道中并输出结果行

nnn289 回答:使用CLI将交错的日志行拆分为表格

新解决方案:

#!/bin/bash

numCols=3
while IFS= read -r line
do
  CLEAN_INPUT=$(sed "s/.*'//; s/\([[:alpha:]]* \)\{3\}###$//" <<< $line)
  awk -F "," -v n=$numCols ' { for (i=1; i <= NF/n; i++) { print $(i),"|",$(i+NF/3),$(i+2*NF/3) } }' <<< $CLEAN_INPUT
done < "input.txt

编辑:仅当INPUT为一行时,此功能才有效:

#!/bin/bash

INPUT="OUT 2019.11.05D04:51:39.583193000 ### hostname ### [blah] From 127.0.0.1 - Some Stuff here: ' Fred@somewhere.com,james@elsewhere.com,Steve@Cabbage.com,75692,45263,99956,London,Sydney,Paris Some other Text ###"
CLEAN_INPUT=$(sed "s/.*'//; s/\([[:alpha:]]* \)\{3\}###$//" <<< $INPUT)
numCols=3
awk -F ",$(i+2*NF/3) } }' <<< $CLEAN_INPUT

您可以试试吗?

这将产生所需的输出:

Fred@somewhere.com |  75692 |  London
 james@elsewhere.com |  45263 |  Sydney
 Steve@Cabbage.com |  99956 |  Paris

我将以文本格式对齐表格作为练习。

,

@stephanmg我已经知道了:

#!/bin/bash
#

read INPUT
CLEAN_INPUT=`echo $INPUT |  cut -d" " -f16- | rev | cut -d" " -f5- | rev | sed 's/ //g'`

#echo $INPUT
#echo $CLEAN_INPUT
numCols=12

# i is affectively row number
# j is the column number i want
# NF/n is the number of rows
# so the field i want at any point is identified as i + (j-1)*NF/n
awk -F "," -v n=$numCols ' { for (i=1; i <= NF/n; i++) { for (j=1; j <= n; j++) { printf $(i+((j-1)*NF/n))"|" } ;print ""}} ' <<< $CLEAN_INPUT

可以工作,但在通过管道传递到此脚本后一行结束:-(

本文链接:https://www.f2er.com/3160382.html

大家都在问