将输出保存在变量中并重新使用它

将输出保存在变量中并重新使用它
page=`grep $x /var/www/vhosts/example.com/statistics/logs/access_log | awk '{print $7}'| sort |uniq -c |sort -nr`
times=`$page | wc -l`

我试图将 grep 的输出保存在变量中作为page.

但后来我想重新使用 grep 输出来计算其他东西。

下面的代码抛出:

command not found

如何解决问题并重用输出?

答案1

因为page变量可以包含任意文本,你不应该使用echo,你应该使用printf

times="$(printf %s\\n "$page" | wc -l)"

另请注意,如果命令的输出中有多个尾随换行符grep,则无论如何都不会得到预期的结果,因为命令替换删除尾随换行符并且echo命令或printf我使用的类似命令将准确添加尾随换行符,无论设置变量grep时从输出中删除了多少个换行符。$page


当然,即使在这种情况下,$times变量也会在开头包含一堆额外的空格,因为这就是wc -l输出其信息的方式。因此,这个答案并没有解决您的脚本的更广泛问题:看起来您正在努力提供更好的bash服务。awk

我可能是错的,这取决于你打算如何处理变量$times,但我严重怀疑它。您很可能可以做您需要的事情(全部你需要的东西)用awk一句话。

答案2

更新:多行 $page 值的修订,感谢@Wildcard!

您在第 2 行上非常接近。只要您的第 1 行确实有效,那么对于第二行,您应该尝试:

times="$(echo "$page" | wc -l)"

解释

  • $()命令替换,相当于使用反引号(在man bash这些中称为backquotes),但我更喜欢,$( )因为它们更容易在代码中发现
  • 仅仅拥有$page不会传递任何东西wc -l
  • $page相反,Bash 会认为您想要运行作为命令写入的任何内容,然后将该命令的输出传递给wc -l,因此如果$page包含5 bla,它将认为5 bla是一个命令。这会导致错误,例如您在看到时发现的错误command not found
  • 因此,要传递值,我们可以使用echo变量$page
  • 但是,如果$page包含多行值,echo $page默认情况下会导致丢失这些行,它们只是变成空格
  • $page为了避免出现这种不良结果,请通过用引号括起来来保留该值和新行:echo "$page"

因此,通过使用echo "$page"wc -l就能够正确接收$page的值。

相关内容