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 ( ).


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

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”


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
    

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

„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/
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.