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
的值。