Przeglądaj pliki bez linii z określonym ciągiem

12

Poszukiwanie programu podobnego taillub lesspozwalającego mi przeglądać moje dzienniki bez wierszy zawierających określony ciąg znaków. Na przykład wyświetl mój syslog bez [UFW BLOCK]linii wprowadzania UFW ( ).

John Gr.
źródło
Chociaż nie jest łatwo podać rozwiązanie dokładnego opisu problemu za pomocą tej funkcji, być może zainteresuje Cię to, że lessoferuje możliwość filtrowania wyświetlanych linii po wzorcu wyrażenia regularnego. Możesz użyć tej funkcji, wpisując, &a następnie wzorzec, i możesz cofnąć, pisząc &samodzielnie.
Aaron

Odpowiedzi:

13

Opcja odwracania dopasowania wzorca -vdla grepjest naprawdę pomocna w tym:

grep -v 'UFW BLOCK' /var/log/syslog

Spowoduje to wyświetlenie wszystkich wierszy niezawierających UFW BLOCK. Ponieważ grepdomyślnie używane są podstawowe wyrażenia regularne, włączenie nawiasów spowoduje wyszukanie dowolnego z pojedynczych znaków „UFW BLOCK”, w tym spacji. Prawdopodobnie skończysz bez wyjścia. Jeśli chcesz się upewnić, że wokół łańcucha znajdują się nawiasy klamrowe, ucieknij przed nimi \[UFW BLOCK\]lub skorzystaj z -Fopcji grepwłączenia tylko stałych ciągów znaków (dzięki Zanna i Steeldriver za radę na ten temat):

grep -Fv '[UFW BLOCK]' /var/log/syslog

Możesz ułatwić przeglądanie, przesyłając dane wyjściowe do pagera, takiego jak less:

grep -v 'UFW BLOCK' /var/log/syslog | less

Lub przekieruj dane wyjściowe do pliku w katalogu domowym w celu późniejszego przeglądania:

grep -v 'UFW BLOCK' /var/log/syslog > ~/filtered_syslog
Arroniczny
źródło
2
Możesz także użyć fgreppolecenia równoważnego z grep -F.
Tulains Córdova
2
@ Człowiek TulainsCórdova grep mówi, że „Bezpośrednie wywoływanie jako egrep lub fgrep jest przestarzałe, ale jest zapewnione, aby umożliwić aplikacjom historycznym, które na nich polegają, działanie niezmodyfikowane”. Nie wiem, czy kiedykolwiek zareagują na tę deprecjację, ale myślę, że używanie tych poleceń nie jest najlepszą praktyką
Aaron
5

Można również użyć sed„s dpolecenie, aby usunąć wiersze z wzorem ze strumienia:

sed '/\[UFW BLOCK\]/d' /var/log/syslog

Uciekamy, []jak zwykle, oznaczają klasę postaci, co oznacza „pasuj do wszystkiego, co jest w środku”

Zanna
źródło
5

Możesz użyć dowolnego narzędzia z funkcjami edycji. Otrzymałeś już rozwiązania za pomocą grepi sedoto kilka innych opcji. Wszystkie one mogą być łatwo przekierowane do lesslub moreczy cokolwiek innego.

  1. Perl

    perl -ne 'print unless /\[UFW BLOCK\]/' /var/log/syslog
    

    Ponieważ jest to Perl, TIMTOWDI! .

    perl -pe '$_="" if /\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ || print' /var/log/syslog
    perl -ne 'print if !/\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '!/\[UFW BLOCK\]/ && print' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ ? "" : print' /var/log/syslog
    
  2. awk

    awk '!/\[UFW BLOCK\]/' file
    
terdon
źródło
2

Możesz także użyć awk:

awk '!/PATTERN/' log

Używam go, gdy mam więcej niż jeden „wzór” i nie chcę używać dwóch greptakich jak:

... | grep -v foo | grep -v bar

której składnia to:

awk '!/PATTERN/ && !/PATTERN2/' log
Ravexina
źródło
„Używam go, gdy mam więcej niż jeden„ wzór ”i nie chcę używać dwóch grep takich jak„ ------ grep -Ev "foo|bar"?
αғsнιη
Możesz także użyć -edo zdefiniowania wielu wzorów. grep -v -e 'foo' -e 'bar'
Arronical
@AFSHIN (Nie wiem, jak mój komentarz został usunięty), miałem na myśli logiczne i nie lub;)
Ravexina
1

Dzięki opcji lesspolecenia &możliwe jest odfiltrowanie, aby wyświetlić tylko pożądany dopasowany wzór, jak poniżej,

& /PATTERN/

w twoim przypadku, jeśli chcesz, aby linie filtru UFW BLOCKnie wyświetlały się w danych wyjściowych, możesz po prostu użyć, &!jak poniżej:

&! /UFW BLOCK/
αғsнιη
źródło