使用 Paste 和 awk 实时格式化 sar 样本

使用 Paste 和 awk 实时格式化 sar 样本

我将实时 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}')

相关内容