我需要理解下面的脚本:
HEADER='CPU pctUser pctNice pctSystem pctIowait pctIdle'
HEADERIZE="BEGIN {print \"$HEADER\"}"
PRINTF='{printf "%-3s %9s %9s %9s %9s %9s\n", cpu, pctUser, pctNice, pctSystem, pctIowait, pctIdle}'
CMD='sar -P ALL 1 1'
FORMAT='{cpu=$3; pctUser=$4; pctNice=$5; pctSystem=$6; pctIowait=$7; pctIdle=$NF}'
FILTER='/Average|Linux|^$|%/ {next} (NR==1) {next}'
$CMD | tee $TEE_DEST | $AWK "$HEADERIZE $FILTER $FORMAT $PRINTF" header="$HEADER"
echo "Cmd = [$CMD]; | $AWK '$HEADERIZE $FILTER $FORMAT $PRINTF' header=\"$HEADER\"" >> $TEE_DEST
该脚本实际上用于找出 cpu 利用率(使用 sar)并打印其值。我在理解HEADER
,时遇到了麻烦HEADERIZE
。PRINTF
这些东西是如何运作的。
答案1
编写脚本的人只是想让更容易地看到驱动输出外观和脚本功能的所有内容。他们似乎没能让你变得更容易:)。
如果您了解 awk 的工作原理(谷歌搜索或阅读man awk
),您会发现它需要一系列图案 {
声明....}
(这是一种过度简化。)像HEADER
和 这样的名称HEADERIZE
是 shell 变量,其值在脚本顶部分配,并且其值在后面使用,前面带有“$”。看到那条$AWK "$HEADERIZE
线了吗?该脚本将运行 awk(大概在其他地方变量 AWK 被定义为类似awk
或/usr/bin/awk
或类似的东西)。 awk 的参数将以 HEADERIZE 变量的值开始,如第二个非空行中所定义。所以该行实际上会读取(假设AWK
变量被定义为awk
):
awk "BEGIN {print "$HEADER"}"
等等。
如果您想了解这一切是如何工作的,请替换echo
或awk
重新定义AWK
变量以echo
使用类似的东西
export AWK=echo
并重新运行脚本。您将看到命令行,因为它们已传递到awk
.
底部有两个命令的原因似乎是,TEE_DEST
作为该脚本执行的结果,名称为变量值的输出文件将包含两个条目。一个是从第一个命令开始,其中变量执行命令行的输出CMD
将存储在名为的文件中$TEE_DEST
,然后传递给awk
命令,其输出将显示在终端。然后第二次只需echo
将字符串放入脚本Cmd = [$CMD]
中,并将该脚本的输出也awk
附加到文件中。$TEE_DEST
VARIABLE
您可以使用以下命令轻松找到每个命名变量的值
echo $VARIABLE
这允许您通过将脚本的某些部分粘贴到终端窗口中来运行它们并检查内容。我发现这是学习脚本编写的绝佳方法。
如果你想放AWK
变量的值,当我告诉你用with覆盖值时,你可以像我上面建议的那样做echo
:
export VARIABLE=new value for the variable