Упрощение ваших внутренних команд (с 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
Как предлагает Чарльз Даффи, с помощью группировки команд в под-оболочке или в одной и той же оболочке вы можете объединить два вывода greps в одном потоке. Тогда вам не нужна 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. Он будет работать намного лучше, если у вас будет много разных строк поиска.