我仍然在学习如何编写bash脚本,所以我已经从我搜索到的几个答案中拼凑了这个脚本。
#!/bin/bash
set -e
run_receiver(){
pushd event-receiver
npm run clean
npm run build
node dist/index.js "$@"
popd
}
run_simulator(){
pushd simulator
npm run clean
npm run build
node dist/index.js "$@"
popd
}
run_receiver "$@" | awk '{ print "[receiver]", $0 }' 2>&1 &
run_simulator "$@" | awk '{ print "[simulator]", $0 }' 2>&1 &
#do other things....此脚本同时运行多个节点应用程序,并在每个节点上先于[name],这样我就可以识别生成每个日志的哪个命令。
现在我也想在每一行中加上日期或某种时间戳。有人能告诉我我如何做到这一点吗?谢谢
发布于 2022-09-23 10:36:22
首先,您可能希望在2>&1之前使用awk,因为如果您想要将时间戳和名称添加到错误消息和标准输出中,这需要首先发生。否则,标准错误消息将不会被awk看到。所以你想:
run_receiver "$@" 2>&1 | awk '{ print "[receiver]", $0 }' &
run_simulator "$@" 2>&1 | awk '{ print "[simulator]", $0 }' &接下来,对于时间戳,您可以使用date并将date的输出作为变量传递给awk:
run_receiver "$@" 2>&1 | awk -v date="$(date)" '{ print date,"[receiver]", $0 }' & 但这并不是您真正想要的:这将计算一次awk启动时的日期,因此所有命令都有相同的日期标记。您需要让awk计算每个输入行的日期,所以您需要一些更复杂的内容:
run_receiver "$@" 2>&1 |
awk '{ com="date -Iseconds"; com | getline date; print date,"[receiver]", $0 }' &它将date -Iseconds存储在变量com中,然后执行com,通过awk的getline传递输出,并将其存储在随后打印的awk变量date中。但是,Ubuntu中的默认awk实际上是mawk和mawk 缓冲它的输入,所以您还需要告诉它不要缓冲,否则时间戳将不正确。所以你需要再做一次调整:
run_receiver "$@" 2>&1 |
awk -Winteractive '{
com="date -Iseconds";
com | getline date;
close(com);
print date,"[receiver]", $0
}' &这将产生这样的输出:
[receiver] 2022-09-23T13:33:23+03:00 line 1
[receiver] 2022-09-23T13:33:24+03:00 line 2
[receiver] 2022-09-23T13:33:25+03:00 line 3
[receiver] 2022-09-23T13:33:26+03:00 line 4您还可以使用GNU awk (在Ubuntu上称为gawk ),它为日期操作提供了一些内置函数:
run_receiver "$@" 2>&1 |
gawk '{ date=strftime("%Y-%m-%d %H:%M:%S"); print "[receiver]",date,$0}' 它产生这样的输出:
[receiver] 2022-09-23 13:35:42 line 1
[receiver] 2022-09-23 13:35:43 line 2
[receiver] 2022-09-23 13:35:44 line 3
[receiver] 2022-09-23 13:35:45 line 4发布于 2022-09-23 12:11:27
您可以使用来自ts包的moreutils命令(可从“宇宙”存储库获得),将[name]合并到可选的格式字符串中,以消除对awk的需求。前:
run_receiver "$@" 2>&1 | ts '[receiver] %Y-%m-%d %H:%M:%S'https://askubuntu.com/questions/1431866
复制相似问题