it-swarm-tr.com

Maça kadar olan tüm dosyaları göster

grep --before-context 5 maçtan önce 5 çizgi gösterir.

Maçtan önce her şeyi göstermek istiyorum.
Yapıyor grep --before-context 99999999 işe yarayacaktı ama çok ... profesyonel değil.

Maça kadar tüm dosya nasıl gösterilir?

78
Nicolas Raoul

Sed bunun için daha iyi.

Sadece yap:

sed '/PATTERN/q' FILE

Şöyle çalışır:

Her satır için /PATTERN:

  • evet ise, yazdırır ve çıkarız
  • aksi takdirde yazdırırız

Bu en verimli çözümdür, çünkü PATTERN görür görmez kapanır. q olmadan sed, dosyanın geri kalanını okumaya devam eder ve dosyayla hiçbir şey yapmaz. Büyük dosyalar için fark yaratabilir.

Bu hile head öykünmek için de kullanılabilir:

sed 10q FILE
104
Mikel

sed, grep işlevlerinin çoğunun yerini alabilir.

sed -n '1,/<pattern>/ p' <file>

Bu, desen eşleşene kadar ilk satırdan baskı anlamına gelir.

Birkaç çeşit örnek

sed -n '/<pattern>/,$ p' <file> # from pattern to end of file
sed -n '/<pattern1>/,/<pattern2>/ p' <file> # from pattern1 to pattern2
39
forcefsck

eşleşmeye kadar eşleşme yazdırın:

awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename

maç dahil olmak üzere AMA DEĞİL yazdırın:

awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename
39
glenn jackman

Günlük işlerde sadece temel araçları hatırlamayı seçen ve daha az zarif ve daha az verimli çözümleri kabul etmeye istekli insanlar için:

head -n $(grep -n pattern filename | cut -d: -f1) filename

Bu komut bir komut dosyası içinse, daha zarif (ve muhtemelen verimli) çözümler arayacağım. Bu bir kerelik bir komut veya bir atmak komut dosyası ise o zaman umurumda değil.

1
lesmana

Mikel'in yukarıdaki cevabına ekleniyor ...


FILE öğesinde PATTERN içeren ilk satırı , ancak içermeyen yazdırmak için şunu deneyin:

  • sed '/.*PATTERN.*/{s///;q;}' FILE

Bu, deseni içeren tüm satırla eşleşir, boş bir satırla değiştirilir, ardından dosyanın geri kalanını işlemeden çıkar.


Sonrası komut dosyası:

Sonunda fazladan yeni bir satır yazdırmayı (başka bir araç kullanmadan) önlemeyi düşünebileceğim en kolay/net yol, sed'i tekrar çalıştırmak ve yeni son satırı silmekti:

sed '/.*PATTERN.*/{s///;q;}' FILE | sed '$d'

... ve bu satırı zaten sildiğimiz için, önceki işimiz gereksizdir ve şunları basitleştirebiliriz:

sed '/PATTERN/q' FILE | sed '$d'
1
Jim Grisham

Aşağıdaki pure GNU grep yöntemleri verimli değildir.

İçindeki " foo " dizesinin ilk örneğine kadar her şeyi arayın üç greps kullanarak dosya çubuğu :

grep -m 1 -B $(grep -n -m 1 foo bar | grep -o '^[0-9]*') foo bar

" foo " ifadesinin son örneğiyle eşleşen:

grep -oPz "(?s)[^\n]*${s}.*?\n.*?foo.*?\n" bar

Not: son grep ile ilgili ayrıntılar şurada bulunabilir: Çok satırlı arama için gerekli olan normal ifade (grep) .

1
agc

Aşağıdakilerden birini de kullanabilirsiniz

tac ./test | grep -B $(cat ./test | wc -l) -m 1 'pattern'|tac 

veya

tac ./test |head -n $(tac ./test | grep -n 'pattern' | cut -d: -f1 | head -n 1)|tac

veya

tac ./test |sed ':a;N;$!ba;s/\n/'"pattern"'/g' | sed 's/'"patternpattern"'/\n/g'|head -n 1|sed 's/'"pattern"'/\n/g'|tac

İlk seçenek OP'nin önerdiğine çok benzer, yalnızca dosyadaki satırları sayarak bağlamdan önce yeterli satır gösterilmesini sağlar

İkinci seçenek ilk eşleşmenin satır numarasını arar (iç 'başı' değiştirerek de değiştirebilirsiniz) ve bu sayıdaki başlığı kullanır

Son seçenek tüm yeni satırları eşleşmeyle değiştirir ve bitişikteki iki eşleşmeyi yeni bir çizgiyle değiştirir. Bunun çıktısı, iki eşleşme arasındaki her metin bloğu için bir satırdır. Bundan sonra, ilk satırı (ilk eşleşmeye kadar metin bloğunu değiştirmek) eşleştirmek ve daha sonra her eşleşmeyi yeni bir satıra yeniden çevirmek için 'head' kullanır. bu seçenek yalnızca dosya aşağıdaki biçimde olduğunda çalışır

pattern
texttexttext
texttexttext texttexttext
texttexttexttexttexttexttexttexttext
pattern
texttexttext
pattern 
texttexttext
texttexttexttexttexttexttexttexttext

vb.

0
user122778