一行打印两个命令的输出

时间:2019-03-06 21:36:30

标签: bash shell

我正在工作:

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秒钟加载一次。

您能帮我找到一种更好的方法吗?

5 个答案:

答案 0 :(得分:3)

您可以使用进程替换来运行lscpucat /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