首页 > 解决方案 > 带有 AWK 输出到 CSV 的 Bash 脚本

问题描述

我在此处的 AWK 脚本上得到了惊人的帮助,我心想,如果我在 CLI 上监视完全相同的输出以转到 CSV 文件,那将是非常酷的。我做了研究,在这里找到了一个很好的答案,它基本上显示了这样的代码:

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 的输出将是锦上添花。我是不是想多了?它应该只是一个单独的脚本吗?如果是这样,怎么做?

标签: bashshellcsvawkcommand-line-interface

解决方案


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

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

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


推荐阅读