我正在工作:
while sleep 5s
do
lscpu | grep 'CPU MHz:' | cut -d ':' -f 2 | awk '{$1=$1};1' && grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'
done
它给了我以下输出:
1601.058
3.4811%
1452.514
3.48059%
1993.800
3.48006%
2085.585
3.47955%
2757.776
3.47902%
1370.237
3.47851%
1497.903
3.47798%
但是我真的很想将两个值放在一行上。每次尝试执行此操作时,都会遇到双/单引号变量问题。当然,我从网络上提取了一些awk内容,所以我并没有真正加快速度。我只想每行打印一次,CPU时钟并每5秒钟加载一次。
您能帮我找到一种更好的方法吗?
答案 0 :(得分:3)
您可以使用进程替换来运行lscpu
和cat /proc/stat
并提供给单个命令。无需使用管道。
while sleep 5; do
awk '/CPU MHz:/{printf "%s ", $NF} /cpu /{print ($2+$4)*100/($2+$4+$5)"%"}' <(lscpu) /proc/stat
done
如果只有一个输入命令:
date| awk '{print $1}'
Wed
OR
awk '{print $NF}' <(date)
2019
如果有多个命令,请执行以下操作:示例,在同一行中获取两个date命令的年份。 (不是非常有用的示例,仅出于演示目的)
awk '{printf "%s ", $1=NF}END{print ""}' <(date) <(date)
2019 2019
答案 1 :(得分:1)
将2条命令的输出通过管道传递到chr()
paste
这2列将由一个制表符分隔。
答案 2 :(得分:0)
出于可读性而不是效率的目的编写文字,您可能会考虑以下内容:
while sleep 5; do
cpu_pct=$(lscpu | awk -F': +' '/CPU MHz:/ { print $2 }')
usage=$(awk '/cpu / {usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}' /proc/stat)
printf '%s\n' "$cpu_pct $usage"
done
命令替换会隐式修剪尾随的换行符,因此,如果lscpu | awk
的输出以换行符结尾,则var=$(lscpu | awk)
会将其删除;之后,您可以使用"$var"
而不会显示换行符。
答案 3 :(得分:0)
您需要做的就是将第一行的换行符更改为其他分隔符。像这样:
lscpu | ... | tr \\n : && grep ...
答案 4 :(得分:0)
您也可以使用echo -n $(command_with_stdout)
。 -n
开关指定将省略新行(\n
)。
while sleep 5s; do
echo -n $( lscpu | grep 'CPU MHz:' | cut -d ':' -f 2 | awk '{$1=$1};1' )
echo -n ' **** '
echo $( grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}' )
done
或同一行中的相同表示形式:
while sleep 5s; do echo -n $( lscpu | grep 'CPU MHz:' | cut -d ':' -f 2 | awk '{$1=$1};1' ); echo -n ' **** '; echo $( grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}' ); done
编辑:(根据查尔斯·达菲的评论,从-n
删除echo
的切换)
while sleep 5s; do echo "$( lscpu | grep 'CPU MHz:' | cut -d ':' -f 2 | awk '{$1=$1};1' ) **** $( grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}' )"; done