zubastiy |
|
Темы:
136
Сообщения:
548
Участник с: 18 сентября 2009
|
Добрый день. Прошу помощи в решений задачки на 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 а с помощью цикла. |
RiD |
|
Темы:
30
Сообщения:
400
Участник с: 27 июня 2011
|
Я бы sed`ом вывел все строки из всех нужных файлов в “файл”, потом sed`ом же их пересчитал. |
mehanoid |
|
Темы:
28
Сообщения:
382
Участник с: 27 апреля 2010
|
А не проще так?#!/bin/bash count=0 for f in *AntiSpam.log do let count+=$(grep -c URIBL_WS_SURBL $f) done echo $count |
RiD |
|
Темы:
30
Сообщения:
400
Участник с: 27 июня 2011
|
:-)cat /mnt/share/*AntiSpam.log | sed '/URIBL_WS_SURBL/!d' | sed -n '$=' |
Natrio |
|
Темы:
47
Сообщения:
4763
Участник с: 08 января 2011
|
grep URIBL_WS_SURBL *AntiSpam.log | wc -l |
RiD |
|
Темы:
30
Сообщения:
400
Участник с: 27 июня 2011
|
NatrioЯ почему-то не сомневался, что увижу здесь и вашу лепту ))) |
Natrio |
|
Темы:
47
Сообщения:
4763
Участник с: 08 января 2011
|
Моя лепта тут очень скромная – я лишь немного упростил ваш вариант ;) |
zubastiy |
|
Темы:
136
Сообщения:
548
Участник с: 18 сентября 2009
|
Natrio спасибо и чего я протупил и полез через ключ -c - сам не пойму, очевидное жеж решение. |
zubastiy |
|
Темы:
136
Сообщения:
548
Участник с: 18 сентября 2009
|
mehanoidтоесть объявлять переменную равную нолю все таки нужно? |
mehanoid |
|
Темы:
28
Сообщения:
382
Участник с: 27 апреля 2010
|
zubastiyВообще в принципе необъявленные переменные в арифметических выражениях bash считает за ноль, но я привык всё же объявлять их все, чтобы не было путаницы |