【问题标题】:Bash Script with AWK output to CSV带有 AWK 输出到 CSV 的 Bash 脚本
【发布时间】:2019-06-09 21:15:12
【问题描述】:

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

【问题讨论】:

  • 听起来你在找tee
  • TEE 看起来是一个非常强大的命令!我今天肯定会研究它。谢谢。
  • 我已尝试再次插入 TEE,但存在架构问题。我将 TEE 放在 TAIL 和 GAWK 之间,它会将带尾的文档完美地输出到辅助文件(包括 GAWK 删除的所有垃圾),但我尝试在很多地方在 GAWK 之后放置相同的 TEE 命令,但它不起作用,不断的语法错误。很遗憾,因为在阅读 TEE 之后,它看起来像是完美的解决方案。 ://
  • wrt constant syntax errors - 如果您需要帮助调试语法错误,您应该告诉我们您收到的错误消息是什么。
  • 答案已更新。很抱歉没有发布确切的错误,但谢谢 Ed。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多