Dosyaları belirli bir dizeye sahip satırlar olmadan görüntüleme


12

Belirli bir dize içeren satırlar olmadan günlüklerimi görmeme izin veren tailveya benzeri bir program aramak less. Örneğin, sistem günlüğümü UFW ( [UFW BLOCK]) giriş satırları olmadan görüntüleyin .


Bu özellik ile sorun tanımınıza kesin bir çözüm sağlamak kolay olmasa da, lessbir regex deseninden sonra görüntülenen çizgileri filtreleme olanağı sunduğunu bilmek isteyebilirsiniz . Bu özelliği, &ardından deseni yazarak kullanabilir ve &tek başına yazarak geri alabilirsiniz .
Aaron

Yanıtlar:


13

İçin kalıp eşleme ters çevirme seçeneği bunun -viçin grepgerçekten yararlıdır:

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

Bu size içermeyen tüm satırları gösterecektir UFW BLOCK. Gibi grepvarsayılan olarak kullandığı temel düzenli ifadeler, parantez dahil uzay dahil 'UFW BLOK' bireysel karakterlerden herhangi aramak yapacaktır. Muhtemelen hiç çıktı almazsınız. Dizenin etrafında parantez bulunduğundan emin olmanız gerekiyorsa, ya bunlardan kaçın ya \[UFW BLOCK\]da yalnızca sabit dizeleri dahil etme -Fseçeneğini kullanın grep( bu konuda tavsiye için Zanna ve Steeldriver'a teşekkürler ):

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

Çıkışı aşağıdaki gibi bir çağrı cihazına bağlayarak görüntülemeyi kolaylaştırabilirsiniz less:

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

Veya daha sonra görüntülemek için çıktıyı ana dizininizdeki bir dosyaya yönlendirin:

grep -v 'UFW BLOCK' /var/log/syslog > ~/filtered_syslog

2
fgrepEşdeğer olan komutu da kullanabilirsiniz grep -F.
Tulains Córdova

2
@ TulainsCórdova grep'in adamı, "Egrep veya fgrep olarak doğrudan çağırma reddedildi, ancak onlara dayanan tarihsel uygulamaların değiştirilmemiş çalışmasına izin vermek için sağlandı" diyor. Hiç bu kullanımdan kaldırılma eylemini yapacaklar mı bilmiyorum, ama sanırım bu komutları kullanmak en iyi uygulama değil
Aaron

5

Desenli satırları akıştan silmek için sed' dkomutunu da kullanabilirsiniz :

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

Biz kaçmak []onlar "içeride burada maç şey" anlamına gelen bir karakter sınıfını belirtmek normalde olarak


5

Düzenleme özelliklerine sahip herhangi bir aracı kullanabilirsiniz. Size şimdiden kullanarak çözümler verildi grepve sedişte birkaç seçenek daha. Bunların hepsi kolayca dağıtılması hedefleniyor lessya moreveya başka bir şey.

  1. Perl

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

    Bu Perl olduğundan, 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

Siz de kullanabilirsiniz awk:

awk '!/PATTERN/' log

Ben birden fazla "desen" var bunu kullanın ve ben grepgibi iki kullanmak istemiyorum :

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

bu sözdizimi:

awk '!/PATTERN/ && !/PATTERN2/' log

------ desen "Birden fazla ait alınca Bunu kullanmak '' ve ben gibi iki grep kullanmak istemiyoruz" grep -Ev "foo|bar"?
αғsнιη

-eBirden çok desen tanımlamak için de kullanabilirsiniz . grep -v -e 'foo' -e 'bar'
Arronical

@AFSHIN (Yorumumun nasıl kaldırılacağını bilmiyorum), mantıklı ve değil demek istedim ya da;)
Ravexina

1

İle lesskomutası &seçeneği aşağıda olduğu gibi yalnızca istenen eşleşti desenini görüntülemek için filtrelemek için mümkün,

& /PATTERN/

sizin durumunuzda filtre hatlarının UFW BLOCKçıktıda görünmemesini istiyorsanız &!aşağıdaki gibi kullanabilirsiniz :

&! /UFW BLOCK/
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.