Sabit bir metinden başlayarak ilk boş satıra kadar Grep


9

Ben böyle bir dosya var prova.txt:

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4

extra1
extra2
bla

Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561

extra2
bla
bla

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131

ve "Burada yakalamaya başla" dan ilk boş satıra geçmeliyim. Çıktı şöyle olmalıdır:

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4

Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131

Gördüğünüz gibi "Buradan yakalanmaya başlayın" dan sonraki satırlar rastgele, yani -A -B grep bayrağı çalışmıyor:

cat prova.txt | grep "Start to grab from here" -A 15 | grep -B 15 "^$" > output.txt

Boş bir satıra kadar yakalanacak ilk satırı yakalayacak bir yol bulmama yardım edebilir misin ("Buradan tutmaya başla" gibi). "Buradan almayı başlat" dan sonra kaç tane rastgele çizgim olacağını tahmin edemiyorum.

Herhangi bir unix uyumlu çözüm takdir edilmektedir (grep, sed, awk perl ya da benzerinden daha iyidir).

DÜZENLENEN: @ john1024 tarafından mükemmel yanıttan sonra, mümkün olup olmadığını bilmek istiyorum:

1 ° bloğu sıralayın (Buradan almaya başlayın: 1 sonra 1 sonra 2)

2 ° kaldır 4 (alfabetik olarak rastgele) satırları fix1, fix2, fix3, fix4 ama her zaman 4

3 ° sonunda sort -u komutu gibi rastgele dupesleri kaldırın

Nihai çıktı şu şekilde olmalıdır:

# fix lines removed - match 1 first time
Start to grab from here: 1
random1
random2
random3
random4

#fix lines removed - match 1 second time
Start to grab from here: 1
#random1 removed cause is a dupe
random22131

#fix lines removed - match 2 that comes after 1
Start to grab from here: 2
random1546
random2561

veya

# fix lines removed - match 1 first time and the second too
Start to grab from here: 1
random1
random2
random3
random4
#random1 removed cause is a dupe
random22131

#fix lines removed - match 2 that comes after 1
Start to grab from here: 2
random1546
random2561

İkinci çıktı birinciden daha iyidir. Başka bir unix komut sihri gereklidir.


1
Bu, java jstack çıktısından belirli bir iş parçacığı için yığın izini almak için gerçekten yararlıdır. Bu soru ve cevapları bulduğuma sevindim!
BenjaminBallard

Yanıtlar:


13

Awk kullanma

Deneyin:

$ awk '/Start to grab/,/^$/' prova.txt
Start to grab from here: 1
random1
random2
random3
random4

Start to grab from here: 2
random1546
random2561

Start to grab from here: 3
random45
random22131

/Start to grab/,/^$/bir aralık tanımlar. Start to grabİlk boş satırla eşleşen ve ardından biten herhangi bir satırla başlar ^$.

Sed kullanma

Çok benzer bir mantıkla:

$ sed -n '/Start to grab/,/^$/p' prova.txt
Start to grab from here: 1
random1
random2
random3
random4

Start to grab from here: 2
random1546
random2561

Start to grab from here: 3
random45
random22131

-nsed'e açıkça istemedikçe hiçbir şey yazdırmamayı söyler. /Start to grab/,/^$/ptarafından tanımlanan aralıktaki herhangi bir satırı yazdırmasını söyler /Start to grab/,/^$/.


Çözümünüz mükemmel, bir şeyler ekleme isteğimi düzenledim. Relly yardımınız için teşekkür ederiz. Teşekkür ederim
heisen

1

Bazı insanların kullanım durumları için yararlı olabileceği için alternatif bir çözüm gönderiyorum. Bu çözüm belirtilen gereksinimlere tam olarak uymuyor, en iyi çözüm için @ John1024'ün cevabına bakınız.

Awk'yi Kayıt Ayırıcısı boş bir dizeye ayarlanmış olarak kullanabilirsiniz; awk bunları boş yeni satırlar olarak yorumlar:

$ awk '/Start/' RS= prova.txt 
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131

Bu sürüm, çıktıdaki boş satırları korumaz. Aynı zamanda eğer varsa maçtan önce bağlam gösterir. Bu davranış, bir dosyadaki bir şey için selamlanırken çok yararlı olabilir ve bunun bir parçası olan yeni satırla ayrılmış bloğu görmek istiyorsanız, örneğin:

$ awk '/random1546/' RS= prova.txt 
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561

Örneğin, inidosyalarda bir şeyler için selamlarken bunu yararlı buluyorum .

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.