grep --before-context 5
maçtan önce 5 satır gösterir.
Maçtan önce her şeyi göstermek istiyorum.
Yapma grep --before-context 99999999
çalışacak ama çok ... profesyonel değil.
Tüm dosyalar nasıl eşleştirilir?
grep --before-context 5
maçtan önce 5 satır gösterir.
Maçtan önce her şeyi göstermek istiyorum.
Yapma grep --before-context 99999999
çalışacak ama çok ... profesyonel değil.
Tüm dosyalar nasıl eşleştirilir?
Yanıtlar:
Sed bunun için daha iyi.
Sadece yap:
sed '/PATTERN/q' FILE
Bu gibi çalışır:
Her satır için, eşleşip eşleşmediğine bakarız /PATTERN
:
Bu en etkili çözümdür, çünkü görür görmez PATTERN
vazgeçer. q
Sed olmadan , dosyanın kalanını okumaya devam edecekti ve hiçbir şey yapamayacaktı. Büyük dosyalar için bir fark yaratabilir.
Bu numara taklit etmek için de kullanılabilir head
:
sed 10q FILE
sed '/PATTERN/Q' FILE
eşleşen satırı atlayacak. Q
bir GNU uzantısıdır, bu nedenle herhangi bir sed ile çalışmaz.
sed
grep'in işlevselliğinin çoğunu değiştirebilir.
sed -n '1,/<pattern>/ p' <file>
Bu, ilk satırdan desen eşleşene kadar yazdırmak anlamına gelir.
Birkaç aralık örneği
sed -n '/<pattern>/,$ p' <file> # from pattern to end of file
sed -n '/<pattern1>/,/<pattern2>/ p' <file> # from pattern1 to pattern2
maçları yazdırabilir ve bunlara dahil:
awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename
maç dahil BUT DEĞİL kadar yazdırın:
awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename
Q
serin ama gnu özgü afaik, sed -n '/pattern/!p;//q'
daha taşınabilir olurdu.
!
yapar p
hatları için geçerli değil eşleşen pattern
, ama sonra //q
beni ... karıştırır
//
"önceki normal ifade" anlamına geliyor ("boş dizeyle eşleşiyor " anlamına geldiğini düşündüm). Aynı çözümün daha kısa bir versiyonu olduğunu düşünüyorum: sed -n '/pattern/q;p
?
Aşağıdaki saf GNU grep
yöntemleri verimli değildir.
Üç s kullanarak , dosya çubuğunda " foo " dizesinin ilk örneğine kadar olan her şeyi arayın :grep
grep -m 1 -B $(grep -n -m 1 foo bar | grep -o '^[0-9]*') foo bar
" Foo " nun son örneğiyle eşleşiyor :
grep -oPz "(?s)[^\n]*${s}.*?\n.*?foo.*?\n" bar
Not: Sonuncuyla ilgili detayları şurada bulabilirsinizgrep
: Gereken çok hatlı arama için Regex (grep) .
grep
sadece tek bir sed
çağrı yürütme meselesi olursa, 7 s (+ pcre) kullanmak istemesin : sed 'x;/./G;//!x;/foo/p;//s/.*//;x;d'
??
sed
kodunuz kendi cevabına değer görünüyor veya diğerlerinden birine eklenebilir. Re 7 grep
s: Çünkü grep
cevap yoktu ... (artı, cevap neden olmadığını göstermeye yardımcı olur .)
Mikel'in cevabına yukarıdakileri ekleyerek ...
Tüm satırları yazdırmak için dahil kadar değil , ilk satırı FILE
içeren PATTERN
, deneyin:
sed '/.*PATTERN.*/{s///;q;}' FILE
Bu, deseni içeren tüm satırı eşleştirir, boş bir satırla değiştirir, ardından dosyanın geri kalanını işlemeden çıkar.
Sonrası komut dosyası:
Sonunda fazladan bir yeni satır yazdırmayı engellemenin en kolay / en net yolu (başka bir araç kullanmadan) tekrar baştan çalıştırmak ve yeni son satırı silmek oldu:
sed '/.*PATTERN.*/{s///;q;}' FILE | sed '$d'
... ve şimdi bu satırı zaten sildiğimize göre, önceki çalışmalarımız gereksiz.
sed '/PATTERN/q' FILE | sed '$d'
sed
çağrı ile nasıl yapıldığını göstermektedir .
tcsh
ve bir bash
takma ad, emin olmak için gerekli Ben hem standart hem de GNU’da sed
(taşınabilirlik için) çalışan nispeten özlü bir hat çözümüne sahipti ; Katkınızın çok iyi karşılandığı tüm gereklilikler. sed
Çok nadiren kullanan biri olarak en önemli şartım, yıllar sonra kolayca düzenlemek veya yeniden amaçlamak istediğimde çabucak anlayabileceğim bir şeydi.
Gündelik işlerde yalnızca temel araçları hatırlamayı tercih eden ve daha az zarif ve daha az verimli çözümler almaya istekli olanlar için:
head -n $(grep -n pattern filename | cut -d: -f1) filename
Bu komut bir komut dosyası içinse, daha şık (ve muhtemelen verimli) çözümler arayacağım. Bu tek seferlik bir komut veya atılma komut dosyası ise umrumda değil.
Ayrıca 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, dosyadaki satırları sayarak bağlamdan önce yeterince satır gösterilmesini sağlar.
İkinci seçenek, ilk eşleşmenin satır numarasını arar (içteki 'başı' değiştirerek bunu da değiştirebilirsiniz) ve bu sayıdaki başı kullanır.
Son seçenek tüm yeni satırları eşleşmeyle değiştirir ve iki bitişik eşleşmeyi yeni bir satırla değiştirir. Bunun çıktısı iki eşleşme arasındaki her metin bloğu için bir çizgidir. Bundan sonra ilk satırı (ilk bloğa kadar metin bloğunu dolaşarak) eşleştirmeyi seçmek için 'head' kullanır ve her maçı yeni bir satıra çevirir. 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
ve diğerleri
sed
alttaki komut bir tür korkutucu.