如何使用 AWK 从 sar 命令中提取 CPU idle 的值

How to extract value of CPU idle from sar command using AWK

sar 命令的输出中,我只想提取 %iowait 值高于设定阈值的行。 我尝试使用 AWK,但不知何故我无法执行该操作。

sar -u -f sa12 | sed 's/\./,/g' | awk -f" " '{ if (  -gt 0 ) print [=11=] }'

我尝试用 , 替换 . 并使用 -gt 但仍然没有任何乐趣。 有人可以提出解决方案吗?

我的sar -u给出了类似下面的几行:

Linux 4.4.0-127-generic (v1)    06/12/2018      _x86_64_        (1 CPU)

12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
12:05:01 AM     all      0.29      0.00      0.30      0.01      0.00     99.40
12:15:01 AM     all      0.33      0.00      0.34      0.00      0.00     99.32
12:25:01 AM     all      0.33      0.00      0.30      0.01      0.00     99.36
12:35:01 AM     all      0.31      0.00      0.29      0.01      0.00     99.39
12:45:01 AM     all      0.33      0.00      0.32      0.01      0.00     99.35
12:55:01 AM     all      0.32      0.00      0.30      0.00      0.00     99.38
01:05:01 AM     all      0.32      0.00      0.28      0.00      0.00     99.39
01:15:01 AM     all      0.33      0.00      0.30      0.01      0.00     99.37
01:25:01 AM     all      0.31      0.00      0.30      0.01      0.00     99.39
01:35:01 AM     all      0.31      0.00      0.33      0.00      0.00     99.36
01:45:01 AM     all      0.31      0.00      0.28      0.01      0.00     99.40
01:55:01 AM     all      0.31      0.00      0.30      0.00      0.00     99.38
02:05:01 AM     all      0.31      0.00      0.28      0.01      0.00     99.40
02:15:01 AM     all      0.32      0.00      0.30      0.01      0.00     99.38
02:25:01 AM     all      0.31      0.00      0.30      0.01      0.00     99.38
02:35:01 AM     all      0.33      0.00      0.33      0.00      0.00     99.33
02:45:01 AM     all      0.35      0.00      0.32      0.01      0.00     99.32
02:55:01 AM     all      0.28      0.00      0.30      0.00      0.00     99.42
03:05:01 AM     all      0.32      0.00      0.31      0.00      0.00     99.37
03:15:01 AM     all      0.34      0.00      0.30      0.01      0.00     99.36
03:25:01 AM     all      0.32      0.00      0.29      0.01      0.00     99.38
03:35:01 AM     all      0.33      0.00      0.26      0.00      0.00     99.40
03:45:01 AM     all      0.34      0.00      0.29      0.00      0.00     99.36
03:55:01 AM     all      0.30      0.00      0.28      0.01      0.00     99.41
04:05:01 AM     all      0.32      0.00      0.30      0.01      0.00     99.37
04:15:01 AM     all      0.37      0.00      0.31      0.01      0.00     99.32
04:25:01 AM     all      1.78      2.04      0.59      0.05      0.00     95.55

要过滤掉 %iowait 大于的那些,比方说,0.01:

sar -u | awk '>0.01{print}'
Linux 4.4.0-127-generic (v1)    06/12/2018      _x86_64_        (1 CPU)
04:25:01 AM     all      1.78      2.04      0.59      0.05      0.00     95.55
05:15:01 AM     all      0.34      0.00      0.32      0.02      0.00     99.32
06:35:01 AM     all      0.33      0.22      1.23      4.48      0.00     93.74
06:45:01 AM     all      0.16      0.00      0.12      0.02      0.00     99.71
10:35:01 AM     all      0.22      0.00      0.13      0.02      0.00     99.63
12:15:01 PM     all      0.42      0.00      0.16      0.03      0.00     99.40
01:45:01 PM     all      0.17      0.00      0.11      0.02      0.00     99.71
04:05:01 PM     all      0.15      0.00      0.12      0.03      0.00     99.70
04:15:01 PM     all      0.42      0.00      0.23      0.10      0.00     99.25

编辑:

正如 @Ed Morton 正确指出的那样,awk 代码可以简化为 awk '>0.01',因为默认操作是打印当前行。

如果我们需要 sar -uiowait > 0.01 的整行输出,那么,我们可以使用这个,

命令

sar -u | grep -v "CPU" | awk ' > 0.01'

输出将类似于

03:40:01 AM     all      3.16      0.00      0.05      0.11      0.00     96.68
04:40:01 PM     all      0.19      0.00      0.05      0.02      0.00     99.74

如果想输出特定的字段,只说iowait,我们可以使用下面给出的方法,

输出特定字段的命令,

sar -u | grep -v "CPU" | awk '{if( > 0.01 ) print }'

输出将是

0.11
0.02

注意 : grep -v 仅用于删除输出中的标题

希望对您有所帮助,