具有AWK输出到CSV的Bash脚本

时间:2019-06-09 21:15:12

标签: bash shell csv awk command-line-interface

我在AWK脚本here上提供了惊人的帮助,并以为自己拥有在CLI上监视的完全相同的输出以转为CSV文件真的很棒。我做了研究,发现了一个不错的答案here,它基本上显示了这样的代码:

awk '{print $1","$2","$3","$4","$5}' < /tmp/file.txt > /tmp/file.csv

我遇到的第一个问题是/tmp/file.txt,因为我的代码已经在生成具有分隔值的字符串。我不知道我的变量是否可以在不运行所有新AWK命令的情况下工作,所以我希望尽可能将其标记到上一个AWK命令的末尾。但是我不知道如何在我正在使用的实际脚本中实现相同的概念。有人可以告诉我格式化格式,我需要将其标记到脚本的末尾吗?

我不断发展的脚本如下:

#!/bin/bash
CURRENT_DATE=`date +%Y-%m-%d`
tail -fn0 /var/log/pi-star/MMDVM-"$CURRENT_DATE".log | gawk '
match($0, /received.*voice header from ([[:alnum:]]+) to ([[:alnum:]]+ 
[0-9]+)/, a) {
in_record = 1
call_sign = a[1]
channel = a[2]
}
in_record && match($0, /DMR ID: ([0-9]+)/, a) {
dmr_id = a[1]
}
in_record && match($0, /([0-9.]+) seconds, ([0-9]+)% packet loss, BER: 
([0-9.]+)%/, a) {
in_record = 0
print call_sign, channel, dmr_id, a[1], a[2], a[3]
}
' OFS=,
done

我仍然想通过终端进行监视,我只是认为将附加到CSV的输出作为锦上添花。我在想什么吗?应该只是一个单独的脚本吗?如果可以,怎么办?

1 个答案:

答案 0 :(得分:0)

在另一个线程上发布了具有更好描述的问题后,有人回答了正确的答案。他说,基本上我所看到的是在进入管道时使用awk缓冲输出(因为开销较低),但是在进入TTY时立即将其写入。他接着通过从awk程序调用fflush()来提供解决方案。

“在打印命令后调用fflush(),添加一个额外的命令fflush()。”

解决了。谢谢大家的努力。