我试图解析收集的一系列顶级日志。解析原始文件后,我当前的文件是这样的:
#TIMESTAMP 1524703273 : 04/25/2018 08:41:13 PM
Cpu(s): 33.9%us, 4.5%sy, 0.0%ni, 60.2%id, 0.0%wa, 0.2%hi, 1.2%si, 0.0%st
#TIMESTAMP 1524703332 : 04/25/2018 08:42:12 PM
Cpu(s): 17.0%us, 2.1%sy, 0.0%ni, 80.7%id, 0.0%wa, 0.1%hi, 0.1%si, 0.0%st
#TIMESTAMP 1524703392 : 04/25/2018 08:43:12 PM
Cpu(s): 16.1%us, 2.7%sy, 0.0%ni, 80.8%id, 0.0%wa, 0.1%hi, 0.3%si, 0.0%st
我只想要“Epoch时间戳(第二列(即)#TIMESTAMP之后的字段),然后是下一行中的%id在同一行”,我希望解析后的输出是这样的(时间戳和%id将始终在备用行中,我希望它在同一行中。
1524703273 60.2
1524703332 80.7
1524703392 80.8
目前,我使用一系列'cut'命令并使用多个输出文件来实现这一目标,有没有更好的方法来实现这一目标。
cut -d' ' -f 2,7 sample.txt > sample1.txt
cut -d' ' -f 2 sample1.txt > sample2.txt
cut -d'%' -f 1 sample2.txt > sample3.txt
然后sed 'N;s/\n/ /' sample3.txt
合并每两行。
如果可以从100中减去第二个值并将其保存在同一个文件中,那就好了。
1524703273 39.8 --> (100-60.2)
1524703332 19.3 --> (100-80.7)
1524703392 19.2 --> (100-80.8)
答案 0 :(得分:3)
尝试:
$ awk '/TIMESTAMP/{ts=$2; getline; print ts, $5+0}' logfile
1524703273 60.2
1524703332 80.7
1524703392 80.8
工作原理:
/TIMESTAMP/{...}
这将选择包含TIMESTAMP
的行,对于那些行和仅那些行,将执行花括号中的命令。这些命令是:
ts=$2
这会将时间戳值保存在变量ts
。
getline
这将在下一行中读到。
print ts, $5+0
这将打印时间戳值ts
,然后是我们刚读取的第五列。通过向第五列中的值添加零,我们强制awk将其转换为数字,并消除不需要的字符%id
。
按字面意思输出所需的输出:
$ awk '/TIMESTAMP/{ts=$2; getline; id=$5+0; printf "%s %s --> (100-%s)\n",ts,100-id,id}' logfile
1524703273 39.8 --> (100-60.2)
1524703332 19.3 --> (100-80.7)
1524703392 19.2 --> (100-80.8)
或者,也许你真正想要的是:
$ awk '/TIMESTAMP/{ts=$2; getline; id=$5+0; print ts, id, 100-id}' logfile
1524703273 60.2 39.8
1524703332 80.7 19.3
1524703392 80.8 19.2
或者,也许:
$ awk '/TIMESTAMP/{ts=$2; getline; id=$5+0; print ts, 100-id}' logfile
1524703273 39.8
1524703332 19.3
1524703392 19.2