如何将 wc -l 输出的内容导入到 echo 输出中?

8

我通过执行命令 grep error logfile | wc -l 来计算日志文件中的错误数量。

它会输出数字 10。

我想打印出 Error count found in logfile is 10

我认为需要通过管道将其传递到 echo 命令,但是如何将 10 追加到 echo 的输出中呢?

我尝试了:

 var="$(grep -i error logfile | wc -l)" | echo "Error count found in logfile is $var"

var="$(grep -i error * | wc -l)" && echo "Error count found in logfile is $var" - Sean Kennedy
非常感谢您。 - GJain
6个回答

9
你不应该将变量传输到echo中,而是按顺序运行它们:
var="$(grep -i error * | wc -l)"
echo "Error count found in logfile is $var"

或者你可以使用 bash 命令来定义变量,只用于 echo 命令:

 var="$(grep -i error * | wc -l)" ; echo "Error count found in logfile is $var"

如下评论所述,您当然可以在echo语句中嵌入您的命令调用:
echo "Error count found in logfile is $(grep -i error * | wc -l)"

看起来在 echo 前需要加上 &&。 - GJain
换句话说,如果你执行 X=42 echo $X,你不能在下一行使用 $X。但是如果你执行 X=42; echo $X,那么你就可以使用了! - zmo
2
@zmo 在哪个版本的 zsh 中,foo=3; foo=5 echo $foo 输出的是 5 而不是 3?预命令环境赋值在任何 POSIX shell 中都有效,但不会影响命令行中的参数扩展。 - chepner
我可能有一个奇怪的“set”环境设置。但我不想查看zshall(1)来知道哪个是正确的,这不是一个POSIX的问题,只要是Bourne衍生就可以了。 - zmo
1
只需像@mklement0的答案一样将其嵌入字符串中即可。额外的$var除了使它更冗长和难以阅读之外,没有任何作用,我个人认为。 - Mort
显示剩余6条评论

4
为了简单地将来自命令的(标准输出)输出嵌入到字符串中,而不需要也存储该输出到一个变量中,请在双引号内使用命令替换($(...))。
echo "Error count found in logfile is $(grep error logfile | wc -l)"

正如Inian的回答中指出的那样,grep通过其-c选项直接支持计算匹配次数,因此上述内容可以简化为:

echo "Error count found in logfile is $(grep -c error logfile)"

如果您需要稍后再次引用它,则使用变量存储 grep 的输出是必需的:

注: 变量是指在程序中分配给特定值的命名内存位置。

var=$(grep -c error logfile)
echo "Error count found in logfile is $var"
# ... use $var again as needed

关于您尝试过的方法:echo只接受命令行参数,不接受标准输入,因此使用管道符(... | echo ...)是错误的方法。

2

使用 printfgrep 命令,带上 -c 标志可以计算模式出现的次数。

printf "Error count found in logfile is %s\n" "$(grep -chi error logfile)"

GNU grep中使用的标志

-c, --count
       Suppress normal output; instead print a count of matching lines for each input file.  
       With the -v, --invert-match option  (see  below),  count  non-matching lines.

-h, --no-filename
       Suppress the prefixing of file names on output.  This is the default when there is 
       only one file (or only standard input) to search.

-i, --ignore-case
          Ignore case distinctions in both the PATTERN and the input files.

1
+1 是因为提到了 grep -c。这里不需要使用 printf,因为你可以直接将命令替换放入消息中,如 echo "foo $(command)"。 - hek2mgl
如果您运行该命令,您将得到类似于“Error count found in logfile is log1.txt:0\nlog2.txt:2\nlog3.txt:4\n”而不是“Error count found in logfile is 10”的结果。 - zmo
1
@zmo:OP已经在一个文件中提到了。 - Inian
1
这可能是一种有用的cat用法 :) .. echo "错误数:$(cat * | grep -c error)" - hek2mgl
1
@mklement0:已修复间距,自动更正搞砸了! - Inian
显示剩余8条评论

1
以下是一些不同处理此任务的示例,只是为了帮助您了解bash的功能和选项:
(echo -en“日志文件中找到的错误计数为”; grep error logfile | wc -l)
{ printf“日志文件中找到的错误计数为”&& wc -l <<(grep error logfile); } printf'日志文件中找到的错误计数为%d \ n'$(grep -c error logfile)
awk '/error/{++c} END{printf“日志文件中找到的错误计数为%d \ n”,c}'logfile var = $(grep -c error logfile); echo“日志文件中找到的错误计数为$ var”
如果您想要使用“here string”:
cat <<<'日志文件中找到的错误计数为$(grep -c error logfile)'
此外,这里是一个仅限bash内置选项的选项:
declare -i c=0
while read l; do
  [[ $l == *error* ]] && ((++c))
done < logfile
echo "Error count found in logfile is $c"`

1
我喜欢awk版本,其中我会省略printf并直接写成print "blabla", c - fedorqui
1
很好的观点。我太专注于bash printf语法了,忘了print函数。 - Jeffrey Cash

-1

echo "在日志文件中发现的错误计数为 "$(grep error logfile | wc -l)


2
不需要使用第二个 echo 命令替换 - 内部的已经足够了。此外,将命令替换嵌入双引号字符串通常更加健壮。 - mklement0
1
你已经回显了字符串,所以他是正确的,内部回显是多余的并浪费了一个子shell。 - clearlight
请尝试在您的回答中提供上下文。仅仅给出一个独立的答案可能可以解决当前特定情况下的问题,但是通过解释,你可以解决许多未来可能遇到的问题。请尽量说明您认为导致问题的原因以及为什么您的答案能够解决它。 - Newd
我不知道该说什么。错误的原因已经在前一个答案的评论中解释过了,所以我不想重复。其他评论提供了两个语句的答案。我试图提供一个集成的单语句来帮助,结果被踩了,这对新手来说是非常沮丧的。 - 0PT1MU5 PR1ME

-1

使用撇号。

var=`cat x.dat | grep error | wc -l`
echo $var

2
\`` 不是撇号(单引号),而是技术上的 _重音符号_ (U+0060),通常称为 _反引号_ (_back tick_)。`...`是命令替换的 _传统_ 语法,而现代语法是$(...)`,正如 OP 所使用的那样。 - mklement0
是的,我同意。我需要在这里进步 :-) - chris01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接