Минизадачка на bash, множество вопросов )

Добрый день.
Прошу помощи в решений задачки на bash. Но не просто в виде готового решения )

Я хотел бы рассказать о задаче и примерном ходе мысли по алгоритму решения и получить советы по оптимальному алгоритму в целом и/или совету по решению подзадач, заради развития и понимания процесса.

Задача - посчитать колво строк с набором симоволов URIBL_WS_SURBL в множестве файлов с суффиксом AntiSpam.log находящихся в одном каталоге.

Как думаю решать.
Грепать нужные мне файлы и считать все вхождения нужного набора символов. Вопрос первый - мб можно не грепать а делать как то по другому? Какой нить sed или awk? Было бы восхитительно подать на вход awk список файлов и с помощью каких либо хаков регулярных выражений порешать задачу вызовом одного только awk )
типа если в строке множества файлов есть URIBL_WS_SURBL прибавь к некоему счетчику +1 и в конце прохода по всем файлам выдай итого.

В процессе написания поста, в интернетах нашел неплохой, на мой взгляд способ решения задачи grep + awk, но при этом я не приобретаю навыки которые мог бы приобрести в процессе изучения. И по этому хотелось бы постучаться о углы и стены ))

Поэтому пойду “своим” путем
Пробую грепать, получаю на выходе

grep -c URIBL_WS_SURBL /mnt/share/*AntiSpam.log
/mnt/share/MDaemon-20111020-AntiSpam.log:25
/mnt/share/MDaemon-20111021-AntiSpam.log:62
/mnt/share/MDaemon-20111022-AntiSpam.log:57
/mnt/share/MDaemon-20111023-AntiSpam.log:20
/mnt/share/MDaemon-20111024-AntiSpam.log:0

через двоеточие у меня есть колво совпадений.
Вопрос уже по первой части - может ли греп откидывать названия файлов и возвращать только результат в символьном виде … или в виде суммы?


Но ладно, двигаюсь дальше, откидываю первое поле с помощью cut используя в качве уникального разделителя символ “:”

grep -c URIBL_WS_SURBL /mnt/share/*-AntiSpam.log | cut -f 2 -d ":"
66
25
62
57
20

И так, у меня есть некий набор чисел, теперь их хотелось бы суммировать.

Пока представляю один способ, перед началом цикла объявить какую либо переменную равную нолю, потом к этой переменной в цикле прибавлять построчную цыфру, в финале вывести значение переменной.
Можно ли обойтись без явного объявления переменной? Скажем, вызвать необъявленную (или стандартную для bash) переменную, а она вернет значение ноль и впоследствии считать с помощью этой переменной? аля awk

grep -c URIBL_WS_SURBL /mnt/share/*-AntiSpam.log | awk -F: '{aaa += $2} END {print aaa}'

вот не соображу даже как это на bash написать ( понимаю, что не оптимальный способ подсчета суммы - но хотелось бы узнать, как такое реализовывать без вызова awk а с помощью цикла.
Я бы sed`ом вывел все строки из всех нужных файлов в “файл”, потом sed`ом же их пересчитал.
https://fastenv.ru
А не проще так?
#!/bin/bash
count=0
for f in *AntiSpam.log
do
	let count+=$(grep -c URIBL_WS_SURBL $f)
done
echo $count
:-)
cat /mnt/share/*AntiSpam.log | sed '/URIBL_WS_SURBL/!d' | sed -n '$='
https://fastenv.ru
grep URIBL_WS_SURBL *AntiSpam.log | wc -l
;)
Natrio
grep URIBL_WS_SURBL *AntiSpam.log | wc -l
;)
Я почему-то не сомневался, что увижу здесь и вашу лепту )))
https://fastenv.ru
Моя лепта тут очень скромная – я лишь немного упростил ваш вариант ;)
Natrio
grep URIBL_WS_SURBL *AntiSpam.log | wc -l
;)

спасибо
и чего я протупил и полез через ключ -c - сам не пойму, очевидное жеж решение.
mehanoid
А не проще так?
#!/bin/bash
count=0
for f in *AntiSpam.log
do
	let count+=$(grep -c URIBL_WS_SURBL $f)
done
echo $count
тоесть объявлять переменную равную нолю все таки нужно?
zubastiy
тоесть объявлять переменную равную нолю все таки нужно?
Вообще в принципе необъявленные переменные в арифметических выражениях bash считает за ноль, но я привык всё же объявлять их все, чтобы не было путаницы
 
Зарегистрироваться или войдите чтобы оставить сообщение.