如何在同一行上打印两个shell命令的输出?

时间:2018-11-12 21:16:44

标签: bash unix

这是我的循环包含的内容:

cat /$f/stat | awk '{print $1,$3,$4,$7,$17}' /$f/stat 
cd $f 
sudo ls fd | wc -l  
cd ..

首先,它显示以下内容的输出:

cat /$f/stat | awk '{print $1,$3,$4,$7,$17}' /$f/stat

它在新行上打印输出:

cd $f 
sudo ls fd | wc -l  
cd ..

如何合并这些内容,以便将它们显示在一行上?

1 个答案:

答案 0 :(得分:0)

首先,使用shellcheck验证脚本。

好像您希望awk的输出和wc -l的输出在同一行上。为此,请使用命令替换:

printf '%s %s\n' "$(awk '{print $1,$3,$4,$7,$17}' "$f/stat")" "$(sudo ls "$f/fd" | wc -l)"
  • UUOC不需要cat | awk-awk从作为参数传递的文件中读取输入;另外,看起来您需要"$f/stat"而不是"/$f/stat"
  • 将变量用双引号引起来以防止word splitting and globbing
  • 使用完整路径$f/fd,而不必执行cd $f并返回

由于解析ls的输出被认为是bad practice,因此可以在Linux上执行以下操作:

printf '%s %s\n' "$(awk '{print $1,$3,$4,$7,$17}' "$f/stat")" "$(sudo find "$f/fd" -maxdepth 1 -print0 | tr -cd '\0' | wc -c)"
  • find ... -print0显示NUL终止的文件列表
  • tr -cd '\0'-删除除NUL以外的所有字符
  • wc -c-计算NUL的数量,即find输出中文件名的数量