ack + grep + 不真正匹配的字符串

ack + grep + 不真正匹配的字符串

我使用 ack 工具(类似 grep 但更强大)来匹配文件中的字符串

请看以下 ack 示例

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

   55305 57262.736 10.106.190.191 9624 0.000460 0.00127 0.00168

我只想在 /var/ntp/ntpstats/file 中搜索 IP 127.0.0.1

但确认返回该行:

   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 之后缺少一些标志?)

谢谢

答案1

.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

正则表达式中的A.匹配除换行符之外的任何单个字符。如果要匹配文字句点,则需要对其进行转义。

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

答案3

仅详细说明一下 Ignacio 的回答:

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

如您所见,使用通配符 (.),该行的上述部分符合您的搜索条件。

相关内容