Как я могу написать обертку вокруг ngrep, которая выделяет совпадения? - PullRequest
2 голосов
/ 18 октября 2008

Я только что узнал о ngrep , классной программе, которая позволяет вам легко перехватывать пакеты, соответствующие определенной строке.

Единственная проблема состоит в том, что может быть трудно увидеть совпадение в большом куске результатов. Я хотел бы написать скрипт-обертку, чтобы выделить эти совпадения - он мог бы использовать escape-последовательности ANSI:

echo -e 'This is \e[31mRED\e[0m.'

Я больше всего знаком с Perl, но я очень доволен решением на Python или любом другом языке. Самый простой подход будет выглядеть примерно так:

while (<STDIN>) {
   s/$keyword/\e[31m$keyword\e[0m/g;
   print;
}

Однако это не очень хорошее решение, потому что ngrep выводит хеш-метки без перевода строки всякий раз, когда получает несоответствующий пакет, и приведенный выше код будет подавлять печать этих хеш-меток, пока скрипт не увидит новую строку.

Есть ли способ сделать выделение, не препятствуя мгновенному появлению хеш-меток?

Ответы [ 7 ]

4 голосов
/ 18 октября 2008

Похоже, это помогает, по крайней мере, сравнивая два окна, одно из которых работает с прямым ngrep (например, ngrep независимо от того, что), а другое передается в следующую программу (с ngrep независимо от | ngrephl target-string).

#! /usr/bin/perl

use strict;
use warnings;

$| = 1; # autoflush on

my $keyword = shift or die "No pattern specified\n";
my $cache   = '';

while (read STDIN, my $ch, 1) {
    if ($ch eq '#') {
        $cache =~ s/($keyword)/\e[31m$1\e[0m/g;
        syswrite STDOUT, "$cache$ch";
        $cache = '';
    }
    else {
        $cache .= $ch;
    }
}
3 голосов
/ 18 октября 2008

Вы также можете передать вывод через ack . Флаг --passthru поможет.

3 голосов
/ 18 октября 2008

Ах, забудь об этом. Это слишком большая боль. Было намного проще получить исходный код для ngrep и заставить его печатать хеш-метки в stderr:

--- ngrep.c     2006-11-28 05:38:43.000000000 -0800
+++ ngrep.c.new 2008-10-17 16:28:29.000000000 -0700
@@ -687,8 +687,7 @@
     }

     if (quiet < 1) {
-        printf("#");
-        fflush(stdout);
+      fprintf (stderr, "#");
     }

     switch (ip_proto) {                 

Тогда фильтрация - это кусок пирога:

while (<CMD>) {
  s/($keyword)/\e[93m$1\e[0m/g;
  print;
}
1 голос
/ 18 октября 2008

Это не должно быть слишком сложно, если у вас есть ответ на этот вопрос .

(По сути, читайте по одному символу за раз, и, если это хеш, напечатайте его. Если это не хеш, сохраните этот символ для последующей печати.)

0 голосов
/ 04 февраля 2009

почему бы просто не вызвать ngrep с параметром -q для удаления хеш-меток?

0 голосов
/ 18 октября 2008

См. Скрипт на в этом посте для Linux-IL, где кто-то задал похожий вопрос . Он написан на Perl и использует модуль CPAN Term :: ANSIColor.

0 голосов
/ 18 октября 2008

Это легко в Python.

#!/usr/bin/env python
import sys, re

keyword = 'RED'

while 1:
    c = sys.stdin.read(1)
    if not c:
        break
    if c in '#\n':
        sys.stdout.write(c)
    else:
        sys.stdout.write(
            (c+sys.stdin.readline()).replace(
            keyword, '\x1b[31m%s\x1b[0m\r' % keyword))
...