Баш, суммируя результаты grep - PullRequest
0 голосов
/ 05 июля 2018

В bash я хочу вывести некоторое целочисленное значение, которое является суммой различных комбинаций "grep | wc -l".

Я пытался

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

Я предположил, что возвращение этих greps - это просто целое число, которое распознает bash, но это не так. Где мне нужно явно и почему?

1 Ответ

0 голосов
/ 05 июля 2018

Упрощение ваших внутренних команд (с 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. Он будет работать намного лучше, если у вас будет много разных строк поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...