Bash,将grep的结果相加

Bash,将grep的结果相加,bash,shell,grep,Bash,Shell,Grep,在bash中,我想回显一些整数值,它是各种“grep | wc-l”组合的总和 我试过了 echo $( (`grep string file.txt | wc-l`) + (`grep string2 file.txt | wc -l`)) 我假设这些grep的返回只是bash能够识别的一个整数,但事实并非如此。我需要在哪里明确说明原因?简化内部命令(使用seq生成行),但保留相同的括号,这不起作用: $ echo $( (`seq 5 | wc -l`) + (`seq 10 | wc -

在bash中,我想回显一些整数值,它是各种“grep | wc-l”组合的总和

我试过了

echo $( (`grep string file.txt | wc-l`) + (`grep string2 file.txt | wc -l`))

我假设这些grep的返回只是bash能够识别的一个整数,但事实并非如此。我需要在哪里明确说明原因?

简化内部命令(使用
seq
生成行),但保留相同的括号,这不起作用:

$ echo $( (`seq 5 | wc -l`) + (`seq 10 | wc -l`))
-bash: command substitution: line 1: syntax error near unexpected token `+'
-bash: command substitution: line 1: ` (`seq 5 | wc -l`) + (`seq 10 | wc -l`)'
Bash中有两个相邻的括号:

$ echo $(( 1+2 ))
3
这项工作:

$ echo $((`seq 5 | wc -l` + `seq 10 | wc -l`))
15
与更现代的版本一样:

$ echo $(( $(seq 5 | wc -l) + $(seq 10 | wc -l) ))
15
因此,括号不匹配且间距不正确


作为补充说明,如果您可以重构两个
grep
以生成一个输出,如下所示:

$ grep "string 1|string2" | wc -l
正如Charles Duffy所建议的,无论是在子shell中还是在同一shell中,您都可以在单个流中组合两个greps输出。那么您就不需要
echo
或算法了

使用
seq
作为两个不同流程生产线的简单模型,您可以执行以下操作:

$ (seq 10; seq 5) | wc -l     # sub shell
      15
$ { seq 5; seq 10; } | wc -l  # same shell
      15
awk '/string1/{c++} /string2/{c++} END{print c+0}' file.txt

最后,在你有“各种”的GRPY-WC-L“组合”的程度时,你可以考虑“代码> AWK < /代码>作为更好的<代码> GRP +>代码> WC< /代码>替换。

你可以做:

$ (seq 10; seq 5) | wc -l     # sub shell
      15
$ { seq 5; seq 10; } | wc -l  # same shell
      15
awk '/string1/{c++} /string2/{c++} END{print c+0}' file.txt

以及比您单独在Bash中所做的要复杂得多的组合。如果有许多不同的搜索字符串,它的性能会更好。

试试
echo$(`grep string file.txt | wc-l`+`grep string2 file.txt | wc-l`))
。。将
改为
)+(
改为
+
wc-l
改为
wc-l
@cc6g11,
$()
不创建算术上下文;
$(())
这样做,因此Sundeep在上面的评论是现代的(高级的)用于命令替换的反勾号的替代方法。反勾号周围的括号是suspectJust do
awk'/string1/{c++}/string2/{c++}END{print c+0}“file.txt
而不是多个grep、pipes、wcs等。@EdMorton:好的观点。添加到我的答案中。为什么要添加两个
wc
s”输出,而不是将两个输入命令集中到一个
wc
?这样做,你甚至不需要命令替换或
echo
。我想他的问题是他为什么使用算术context没有处理两个子流程,并试图回答这个问题,而不是重写他的实际用途以使其更好——这也是一个合理的答案。@CharlesDuffy:我在我的答案中添加了这个建议。一如既往,感谢你的sage Bashism!还有
grep-c
grep | wc-l
的作用相同。请使用附加的
next
awk'/string1/{c++;next}/string2/{c++}END{print c+0}file.txt
中,当您希望得到与
grep-c“string 1 | string2”file.txt相同的结果时