Nasıl eşleşmeleri vurgular ngrep etrafında sarıcı yazabilirim?

oy
2

Sadece öğrendim ngrep , kolayca belirli bir dizeyle eşleşen paketleri dinleyen sağlayan serin bir programa.

Tek sorun çıktı büyük blob maçı görmek zor olabilir olmasıdır. Bunları eşleşmeleri vurgulamak için bir sarıcı betik yazmak istiyorum - bu ANSI çıkış sırasını kullanabilirsiniz:

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

Ben Perl ile en tanıdık değilim, ama Python içinde bir çözelti veya başka herhangi bir dil ile gayet mutluyum. En basit yaklaşım gibi bir şey olacaktır:

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

ngrep olmayan bir eşleştirme paketini alır zaman satırbaşıyla olmadan karma işaretleri yazdırır ve komut dosyası bir yeni satır görene kadar Yukarıdaki kod bu hashmarks basılmasını bastırmak çünkü Ancak, bu, güzel bir çözüm değildir.

hashmarks anlık görünümünü inhibe etmeden vurgulama yapmak için herhangi bir yolu var mı?

Oluştur 17/10/2008 saat 23:32
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
4

Bu (örneğin ngrep ne olursa olsun) ve bir (| hedefleyebileceğim dize ngrephl ne olursa olsun ngrep ile) Aşağıdaki programa yöneltilen en az iki pencere, bir düz Ngrep çalışan karşılaştırarak, hileye neden olabilir.

#! /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;
    }
}
Cevap 18/10/2008 saat 09:57
kaynak kullanıcı

oy
3

Sen boru içinden çıkışını da olabilir ack . --passthru bayrağı yardımcı olacaktır.

Cevap 18/10/2008 saat 05:13
kaynak kullanıcı

oy
3

Unut gitsin. Bu acı çok fazla. Ngrep ve stderr'e karma işaretlerini yazdırmak yapmak için kaynak elde etmek daha kolaydı:

--- 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) {                 

Daha sonra, filtreleme oyuncağı olup:

while (<CMD>) {
  s/($keyword)/\e[93m$1\e[0m/g;
  print;
}
Cevap 18/10/2008 saat 00:30
kaynak kullanıcı

oy
1

Eğer cevabı varsa Çok zor olmamalı bu soruyu .

(Esas olarak, bir defada bir karakter okuma ve bir karma ise, bu bir karma değilse,. Yazdırmak sonra bastırmak karakteri kaydedin.)

Cevap 18/10/2008 saat 00:12
kaynak kullanıcı

oy
0

karma işaretlerini ortadan kaldırmak için neden sadece -q parametresi ile ngrep diyoruz?

Cevap 04/02/2009 saat 21:08
kaynak kullanıcı

oy
0

Bu Python kolaydır.

#!/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))
Cevap 18/10/2008 saat 00:40
kaynak kullanıcı

oy
-1

Komut dosyasını bakın birileri benzer bir soru sordu Linux-IL için bu yazı . Bu Perl ile yazılmış ve CPAN Dönem :: ANSIColor modülünü kullanan var.

Cevap 18/10/2008 saat 06:30
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more