1

Я использую инструмент ack (например, grep, но более сильный) для сопоставления строк в файлах

Пожалуйста, посмотрите на следующий пример подтверждения

  ./ack -a 127.0.0.1 /var/ntp/ntpstats/file

   55305 57262.736 10.106.190.191 9624 0.000460 0.00127 0.00168

Я хочу искать только IP 127.0.0.1 в /var /ntp /ntpstats /file

но верните строку:

   55305 57262.736 10.106.190.191 9624 0.000460 0.00127 0.00168

Таким образом, кажется, что ack соответствует 127.0.0.1, но на самом деле строка не имеет адреса 127.0.0.1

Может кто-нибудь дать мне совет, как точно подобрать инструмент ack? (может быть, некоторые пропущенные флаги после ack?)

Спасибо

3 ответа3

3

. это метасимвол в Perl. Это означает «соответствовать любому персонажу». У вас есть три варианта.

  • ack '127\.0\.0\.1' Цитирует каждый период, делая каждый фактический период.
  • ack '\Q127.0.0.1' В регулярных выражениях Perl \Q означает " заключить в кавычки все метасимволы после \Q"
  • ack -Q 127.0.0.1 Поскольку \Q очень распространен, ack имеет ключ -Q что означает то же самое.

Кроме того, я вижу, что вы используете ключ -a , предположительно, чтобы убедиться, что вы соответствуете файлам, которые не имеют расширения. Это не нужно, если вы указываете файл для поиска.

2

. в регулярном выражении соответствует любой отдельный символ, кроме новой строки. Вам нужно будет избежать этого, если вы хотите соответствовать буквальному периоду.

./ack -a '127\.0\.0\.1' /var/ntp/ntpstats/file
0

Просто чтобы проработать ответ Игнасио:

55305 57262.736 10.106.190.191 9624 0.000460 0.00127 0.00168
                                                 ^^^^^^^^^

Как видите, с диким символом (.) Вышеуказанная часть строки соответствует вашим критериям поиска.

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