【发布时间】:2015-11-04 23:01:14
【问题描述】:
我在 AIX 6.1 上运行它。
此命令的预期目的是以下列格式显示以下信息:
GetUsedRAM:GetUsedSwap:CPU_0_System:CPU_0_User:…CPU_N_System:CPU_N_User
该命令由几个子命令组成:
echo `vmstat 1 2 | tr -s ' ' ':' | cut -d':' -f4,5,14-15 | tail -1 | sed 's/\([0-9]*:[0-9]*:\)\([0-9]*:[0-9]*\)/\1/'``mpstat -a 1 1 | tr -s ' ' '|' | head -8 | tail -4 | cut -d'|' -f 25,27 | awk -F "|" '{printf "%.0f:%.0f:",$2,$1}' | sed '$s/.$//'| sed -e "s/ \{1,\}$//"| awk '{int a[10];split($1, a,":");printf("%d:%d:%d:%d:%d:%d:%d:%d",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7])}'`
为了清楚起见,我将重新格式化:
echo \
`vmstat 1 2 |
tr -s ' ' ':' |
cut -d':' -f4,5,14-15 |
tail -1 |
sed 's/\([0-9]*:[0-9]*:\)\([0-9]*:[0-9]*\)/\1/' \
` \
`mpstat -a 1 1 |
tr -s ' ' '|' |
head -8 |
tail -4 |
cut -d'|' -f 25,27 |
awk -F "|" '{printf "%.0f:%.0f:",$2,$1}' |
sed '$s/.$//' |
sed -e "s/ \{1,\}$//" |
awk '{int a[10];split($1, a,":");printf("%d:%d:%d:%d:%d:%d:%d:%d",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7])}' \
`
我了解所有 tr、cut、head tail 和(大致) vmstat/mpstat 命令。第一个 sed 是我迷路的地方,我尝试在较小的部分中运行命令,但不太确定为什么它似乎可以作为一个整体工作,但在下一个 之前截断命令时却不行>tr。
我对 awk 命令也不太确定,尽管我模糊地理解了这个前提,因为它是一个允许格式化输出的函数。
同样,我对 sed 是一个允许在某些文件中替换某些字符串/字符的命令有模糊的理解。
我无法弄清楚上述案例中的具体实现是什么。
任何人都可以就整个命令上下文中的每个 sed 和 awk 步骤的确切情况提供一些清晰或方向吗?
感谢您的帮助。
【问题讨论】:
-
第一个
sed命令末尾的``mpstat -a 1 1部分没有意义,我很惊讶它没有给你语法错误——它打算做什么?哦,等等——你没有正确地扩展你的单线。我会编辑它来为你解决这个问题。 -
好的,我已经这样做了,但是现在 - 最后一个 awk 命令一定会给你一个语法错误,对吧?声明
int a[10]似乎试图声明一个大小为 10 的数组a包含整数,但您没有声明 awk 变量,而单词int是 awk 函数的名称,而不是类型(所有 awk标量变量属于“数字字符串”类型)。老实说,整个命令行是一团糟,应该放弃,而使用单个 awk 命令 - 如果您向我们展示示例输入(vmstat 和 mpstat 命令的输出)以及相关的所需输出,我们可以为您提供帮助。跨度> -
您需要缩小问题的范围,或者使其更精确。如果您想知道
sed 's/\([0-9]*:[0-9]*:\)\([0-9]*:[0-9]*\)/\1/做了什么,那么您应该问一下。 -
man sed ; man awk怎么样?或者——更好的是——从网上阅读文档。 -
@EdMorton 感谢您的编辑。预期目的是以固定格式显示 Ram 使用情况、Swap 使用情况和 Cpu 使用情况信息。该格式是该问题第三行显示的格式。例如。 542067:173374:0:0:35:0:0:0:0:0 是我从完整命令中得到的输出。将命令作为一个整体运行不会产生语法错误,但在某些部分会产生。我同意该声明是一团糟,但这是我得到的。