Bash,将grep的结果相加
在bash中,我想回显一些整数值,它是各种“grep | wc-l”组合的总和 我试过了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 -
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 doawk'/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相同的结果时