Мне нужно отфильтровать 5 IP-адресов в файле. Все файлы * .tgz.

IP-адреса: 10.85.1.1, 10.85.1.2, 10.85.1.3, 10.85.1.4, 10.85.1.5

Я использую эту команду:

zegrep -ai "10.85.1.[1-5]" *.tgz 

Это возвращает меня также, например, Ip 10.85.1.45. Как мне сказать команде, что [1-5] это конец моей строки?

Я думал, что это добьется цели:

zegrep -ai '10.85.1.[1-5]$' *.tgz

Но это ничего мне не возвращает. Тем не менее, это возможно, так что дважды проверьте мою команду, которую я попробовал с Ip, которые находятся в файле (я просто взял хвост и взял один из последних Ip, который он возвратил).

zegrep -ai '10.85.1.1[5-6]$' *.tgz

Это также ничего не возвращает. Так что моя команда все еще не верна.

1 ответ1

2

Есть несколько замечаний по поводу выражений, которые вы пытаетесь:

  • Когда вы используете . это будет соответствовать любому отдельному символу: чтобы соответствовать . его нужно экранировать, как в "10\.85\.1\.[1-5]" .
  • Если распакованный файл является двоичным (как подразумевается -a ), вы не можете предполагать, что конец строки будет обработан правильно.
  • Вы можете использовать "10\.85\.1\.[1-5][^0-9]" , то есть строку поиска, за которой следует нечисловой символ, но это не будет выполнено в конце строки, где есть нет следующего символа.
  • Ответ заключается в использовании разделителей слов \< и \> :

    zegrep -ai "\<10\.85\.1\.[1-5]\>" *.tgz

Добавляя ведущий \< вы избегаете несоответствия с подобными 110.85.1.1 .

В зависимости от вашей версии регулярных выражений может потребоваться использовать альтернативный разделитель слов \b :

    zegrep -ai "\b10\.85\.1\.[1-5]\b" *.tgz

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .