Используя grep для нахождения сначала двух чисел IP-адресов?

Если я правильно понимаю свою цель, следующее будет делать то, что вы хотите:

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 .

0
28.02.2014, 10:58
2 ответа

Файлы журнала 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 напечатать результат, если произойдет подстановка.

1
28.01.2020, 02:28

Для простого списка адресов IPv4 простой cut должно быть достаточно:

cut -d "." -f -2 tmp_exim | сорт -u

2
28.01.2020, 02:28

Теги

Похожие вопросы