Если я правильно понимаю свою цель, следующее будет делать то, что вы хотите:
find ./recup*/ -name '*.txt' -exec grep -qi "searchPattern" {} \; -exec cat {} \; > outputfile.txt
Это будет выглядеть все *. TXT
файлы в ./recup*/
, тестируйте каждый для поиска
, если он соответствует этому CAT
файл. Выход всех файлов
файлов
будет направлен в Oddeffile.txt
.
Повторите для каждого шаблона и выходного файла.
Если у вас очень большое количество каталогов сопоставления ./ Recup *
, вы можете в конечном итоге со списком аргументов
. Простой способ вокруг этого состоит в том, чтобы сделать что-то вроде этого вместо этого:
find ./ -mindepth 2 -path './recup*.txt' -exec grep -qi "searchPattern" {} \; -exec cat {} \; > outputfile.txt
Это будет соответствовать полный путь. Итак ./ Recup01234 / foo / bar.txt
будет сопоставлено. -Mindepth 2
так, что он не будет совпадать ./ recup.txt
, или ./ Recup0.txt
.
Файлы журнала exim`a содержат множество данных в каждой строке. Продолжая подход OP к разделению IP-информации, рассмотрим:
unique_ips2=$(grep "$email" tmp_exim | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.' | sort -u)
Первое изменение, приведенное выше, заключается в том, чтобы поместить регулярное выражение в одинарные кавычки, чтобы bash не вмешивался в него. Второе изменение - это выход из точки. Неэкранированная точка означает любой символ, но мы хотим, чтобы она означала только буквальную точку. Третье изменение - добавить (буквальную) точку в конце регулярного выражения. Это предотвращает совпадение регулярного выражения с двумя последними числами IP-адреса.
sed
также может сделать это хорошо:
unique_ips2=$(sed -nr "/$email/"' s/.*\[([0-9]{1,3}\.[0-9]{1,3})\..*/\1/p' tmp_exim | sort -u)
Параметр -n
указывает sed не печатать ничего, пока мы не попросим его явно, и -r
сообщает об этом, для удобства использовать расширенное регулярное выражение. (OSX отличается: замените -r
на -E
.) Выражение / $ email /
указывает sed
работать только со строками. с этим адресом электронной почты. (При использовании sed
, grep
часто бывает лишним.) Суть команды - это подстановка s /.* \ [([0-9] {1,3 } \. [0-9] {1,3}) \ .. * / \ 1 / p
. Это ищет любой текст (. *
), за которым следует буквальная открытая квадратная скобка (в моих журналах exim перед IP-адресом всегда стоит открытая квадратная скобка), за которым следует число, точка, другое число, точка и вообще что угодно (. *
). Регулярное выражение номер-период-номер сгруппировано в круглых скобках. Это означает, что мы можем ссылаться на него как на \ 1
(это единственная группировка по скобкам, поэтому она также является первой).Таким образом, команда замены заменяет всю строку только первыми двумя числами IP-адреса. Последний p
в команде указывает sed
напечатать результат, если произойдет подстановка.
Для простого списка адресов IPv4 простой cut
должно быть достаточно:
cut -d "." -f -2 tmp_exim | сорт -u