![使用 Paste 和 awk 实时格式化 sar 样本](https://linux22.com/image/70190/%E4%BD%BF%E7%94%A8%20Paste%20%E5%92%8C%20awk%20%E5%AE%9E%E6%97%B6%E6%A0%BC%E5%BC%8F%E5%8C%96%20sar%20%E6%A0%B7%E6%9C%AC.png)
我将实时 sar 样本与粘贴结合起来,并尝试使用 awk live 格式化输出。
它按预期工作来格式化输出,但它不会对每个样本实时进行格式化,而是等到完整的 50 秒(5 秒样本,其中 10 个)完成。
解决方案是(stdbuf -o0)禁用输出流上的缓冲
stdbuf -o0 paste <(sar -q 1 5) <(sar -r 1 5) | awk '{printf "%8s %2s %7s %7s %7s %8s %9s %8s\n", $1,$2,$3,$4,$5,$11,$12,$13}'
11:53:21 AM runq-sz plist-sz ldavg-1 kbmemfree kbmemused %memused
11:53:22 AM 1 167 0.03 46504 449264 90.62
11:53:23 AM 1 167 0.03 46504 449264 90.62
11:53:24 AM 1 167 0.03 46504 449264 90.62
11:53:25 AM 1 167 0.03 46008 449760 90.72
11:53:26 AM 1 167 0.03 46624 449144 90.60
Average: 1 167 0.03 0.05 90.64 40876 172816
第一个 sar 命令
sar -q 5 10 | awk '{printf "%-8s %-2s %7s %7s %7s\n", $1,$2,$3,$4,$5}'
01:02:08 AM runq-sz plist-sz ldavg-1
01:02:13 AM 1 160 0.09
01:02:18 AM 1 160 0.08
01:02:23 AM 1 160 0.08
第二个 sar 命令
sar -r 5 10 | awk {'printf "%-8s %-2s %9s %9s %8s\n", $1,$2,$3,$4,$5}'
01:19:27 AM kbmemfree kbmemused %memused
01:19:32 AM 113840 381928 77.04
01:19:37 AM 113800 381968 77.05
01:19:42 AM 113840 381928 77.04
单独使用粘贴即可实时合并两个 sar 报告
paste <(sar -q 5 10) <(sar -r 5 10)
01:21:09 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked 01:21:09 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
01:21:14 AM 2 159 0.00 0.03 0.05 0 01:21:14 AM 111416 384352 77.53 12512 142052 948776 191.37 195400 121036 56
01:21:19 AM 2 157 0.00 0.03 0.05 0 01:21:19 AM 111928 383840 77.42 12512 142056 947168 191.05 195060 121036 60
01:21:24 AM 1 156 0.00 0.03 0.05 0 01:21:24 AM 112244 383524 77.36 12528 142060 946784 190.97 194932 121052 72
尝试在粘贴内使用 awk 进行格式化,直到 sar 样本完成后才显示任何内容
在粘贴合并后进行 awk 格式化时会发生同样的情况
paste <(sar -q 5 10 | awk '{printf "%-8s %-2s %7s %7s %7s\n", $1,$2,$3,$4,$5}') <(sar -r 5 10 | awk {'printf "%9s %9s %8s\n", $3,$4,$5}')
01:56:53 AM runq-sz plist-sz ldavg-1 kbmemfree kbmemused %memused
01:56:58 AM 1 157 0.00 99664 396104 79.90
01:57:03 AM 1 157 0.00 99664 396104 79.90
01:57:08 AM 1 157 0.00 99644 396124 79.90
01:57:13 AM 1 157 0.00 99612 396156 79.91
01:57:18 AM 1 157 0.00 99628 396140 79.90
01:57:23 AM 1 157 0.00 99656 396112 79.90
01:57:28 AM 1 157 0.00 99520 396248 79.93
01:57:33 AM 1 157 0.00 99656 396112 79.90
01:57:38 AM 2 157 0.00 99268 396500 79.98
01:57:43 AM 1 157 0.00 100152 395616 79.80
Average: 1 157 0.00 0.01 396122 79.90 17557
如果我使用完整的 sar 日志而不是样本,它显然可以工作
paste <(sar -q | awk '{printf "%-8s %-2s %7s %7s %7s\n", $1,$2,$3,$4,$5}') <(sar -r | awk {'printf "%9s %9s %8s\n", $3,$4,$5}')
12:00:01 AM runq-sz plist-sz ldavg-1 kbmemfree kbmemused %memused
12:10:01 AM 3 156 0.00 71500 424268 85.58
12:20:01 AM 1 150 0.00 110836 384932 77.64
12:30:01 AM 1 150 0.00 108164 387604 78.18
那么,是否有办法在每个示例之后将粘贴命令更新为 awk,以便我可以实时观看格式化的输出滚动?
答案1
答案在关闭管道中的缓冲提供几种您可以使用的技术。主要思想是未连接到交互式终端(例如,在管道中)的命令正在使用缓冲。可以使用不同缓冲设置运行另一命令的一个命令是 GNU coreutilsstdbuf
命令,您可以将其应用于您的情况,取消缓冲每个命令
paste <(stdbuf -i0 -o0 -e0 sar -q 5 10 | stdbuf -i0 -o0 -e0 awk '{printf "%-8s %-2s %7s %7s %7s\n", $1,$2,$3,$4,$5}') <(stdbuf -i0 -o0 -e0 sar -r 5 10 | stdbuf -i0 -o0 -e0 awk {'printf "%9s %9s %8s\n", $3,$4,$5}')
上面的 stdbuf 用于取消缓冲每个 awk 和 sar 命令的输入、输出和标准错误。
正如评论中指出的,在这种情况下,只需要非缓冲输出,因此可以缩短为
paste <(stdbuf -o0 sar -q 5 10 | stdbuf -o0 awk '{printf "%-8s %-2s %7s %7s %7s\n", $1,$2,$3,$4,$5}') <(stdbuf -o0 sar -r 5 10 | stdbuf -o0 awk {'printf "%9s %9s %8s\n", $3,$4,$5}')