bash - 带有 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 的输出将是锦上添花。我是不是想多了?它应该只是一个单独的脚本吗?如果是这样,怎么做?
解决方案
在另一个线程上发布具有更好描述的问题后,有人回答了正确的答案。他说,基本上我看到的是 awk 缓冲输出,当它进入管道时(因为这是较低的开销),但当它进入 TTY 时立即写入。他继续通过从 awk 程序调用 fflush() 来提供解决方案。
“调用 fflush(),在你的打印命令之后,添加一个额外的命令 fflush()。”
那解决了它。谢谢大家的努力。
推荐阅读
- node.js - 如何使用nodejs进行jwt令牌验证
- c++ - 直接展示视频捕捉性能
- asp.net - ASPX 页面格式
- perl - 打开文件时不需要的 \x{d}
- vue.js - 如何使用 npm 链接修复 vuejs 模块中的“找不到模块”
- ruby-on-rails - 在创建属于另一个模型的模型的新实例时,在#new, "undefined method 'posts' for nil:NilClass" 中获取 NoMethodError
- xamarin.forms - 使用 Xamarin Webview 将第三方网站的字体替换为要在我的应用程序上显示的自定义字体
- websphere-liberty - CICS ECI 自由
- swift - 用于读取浏览器历史记录的 Safari 应用程序扩展
- javascript - 如何从 Jupyter 笔记本内核执行方法中检索 html 输出?