Bash,将grep的结果加在一起

时间:2018-07-05 16:05:00

标签: bash shell grep

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

我尝试过

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

我假设这些抓狂的回报仅仅是bash会识别的整数,但事实并非如此。我需要在哪里明确说明为什么?

1 个答案:

答案 0 :(得分:2)

简化内部命令(使用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中的

Arithmetic Expansion是两个紧挨着的括号:

$ 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)所建议的那样,使用command grouping在子外壳程序或同一外壳程序中,您可以在单个流中组合两个抓取输出。然后,您不需要echo或算术。

使用seq作为来自两个不同过程的行的简单模型,您可以执行以下操作:

$ (seq 10; seq 5) | wc -l     # sub shell
      15
$ { seq 5; seq 10; } | wc -l  # same shell
      15

最后,在某种程度上,您具有各种“ grep | wc -l“组合”,您可能认为awk是更好的grep + wc替代品。

您可以这样做:

awk '/string1/{c++} /string2/{c++} END{print c+0}' file.txt

以及比您仅在Bash中应做的复杂得多的组合。如果您有许多不同的搜索字符串,则效果会更好。