在bash中,我想回显一些整数值,该整数值是各种“ grep | wc -l”组合的总和。
我尝试过
echo $( (`grep string file.txt | wc-l`) + (`grep string2 file.txt | wc -l`))
我假设这些抓狂的回报仅仅是bash会识别的整数,但事实并非如此。我需要在哪里明确说明为什么?
答案 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中应做的复杂得多的组合。如果您有许多不同的搜索字符串,则效果会更好。