Linux - belirli satırlardan dosyanın sonuna kadar "grep"


6

Buna benzer bir metin dosyasına sahibim:

line 1
line 2A
line 3
line 4A
line 5

"2A" satırından dosyanın sonuna kadar "grep" yapmak istiyorum, bunun gibi bir şey

cat file.txt|some_grep "line 2A"

Ayrıca, "2A" satırından "A" içeren bir sonraki satıra "grep" yapmak istiyorum, bunun gibi bir şey

cat file.txt| some_grep "A"

Bunun yazdırılmasını istiyorum:

line 2A
line 3
line 4A

Bunu başarmamda hangi komut bana yardımcı olabilir?


Birincisi, awk range paternleri için önemsiz olan awk '/line 2A/,0've ikincisi olabilir awk '/line 2A/,/A/&&!/line 2A/'veya A'dan önce en az bir karakter olabilirseawk '/line 2A/,/[^2]A/'
dave_thompson_085

Teşekkürler, bunu bir cevaba çevirirseniz, cevabı ... olarak işaretlerim.
phong

Yanıtlar:


2

(yorumdan genişletildi)

awkGNU-awk (gawk) kılavuzunda açıklandığı gibi, bu ihtiyaca tam olarak uyan hatların 'aralıklarını' seçme yeteneğine sahiptir . (Bu özellik başka dillerde çalışır awkancak gawkkılavuzun bağlanması kolaydır.)

awk '/line 2A/,0'Birincisi ile başlayan line 2Ave girişin sonuna kadar devam eden satırları yazdırır çünkü 0hiçbir zaman gerçek olmayan bir durumdur.

awk '/line 2A/,/A/&&!/line 2A/'eşleşen line 2Abir satırdan sonra eşleşen ve durduğu bir satırla yazdırmaya başlar , Aancak NOT line 2A(ve bu nedenle başlangıç ​​satırıyla aynı satır olamaz). Bir sonraki ve daha sonra tekrar başlayacaktır ; eğer bunu önlemek istiyorsan, bunun için biraz daha karmaşık yollar var. line 2A

Durdurma hatları hep dışında bazı karakter varsa 2önce Abu basitleştirilmiş olabilir awk '/line 2A/,/[^2]A/'A. tarafından takip 2'den dışında herhangi bir karakterle eşleşir bir hat, sonra durur ki bu bir varyasyonunu isteyebilirsiniz, örneğin herhangi bir-tek durmak için digit-A 2A'dan farklı, ancak diğer değil Gibi WHAT; bunun için durma koşulu olabilir ,/line [013-9]A/.


5

"2A" satırından dosyanın sonuna kadar "grep" yapmak istiyorum:

sed -n '/2A/,$p'
  • -n: sedvarsayılan çıktıyı bastır
  • / 2A /: "2A" içeren ilk satırdan çıkış çizgileri
  • $: dosyanın sonuna

"2A" satırından "A" içeren bir sonraki satıra "grep" yapmak istiyorum:

sed -n '/2A/,/A/p'
  • / A /: bir çizgi "A" içerene kadar çıktı

"A" içeren ilk satırdan diğerine "grep" yapmak istiyorum:

printf "/A\n.+1,/A/p\nq" | ed -s

$ > foo echo "line 1
line 2A
line 3
line 4A
line 5"

$ sed -n '/2A/,$p' foo
line 2A
line 3
line 4A
line 5

$ sed -n '/2A/,/A/p' foo
line 2A
line 3
line 4A

$ printf "/A\n.+1,/A/p\nq" | ed -s foo
line 2A
line 3
line 4A

some_grep "A"OP'nin "A" içeren iki arasında en küçük satır aralığını istediğini öne süren bir soru var. / 2A / ila / A / aralığını tanımlamak, yanıt yerine belirli bir durum ve geçici bir çözümdür.
Techraf

@techrat Cevabımda alıntı yaptığım soruyu cevaplıyorum. Verilen parametre ile bir çelişki var. Cevap güncellendi.
Jlliagre

Maalesef sed -n '/A/,/A/p'yanlış bir cevap. "A" içeren ikiden fazla satır içeren bir giriş dosyası ile deneyin.
Techraf

@techraf Gerçekten, cevap tekrar güncellendi.
Jlliagre

1

Bence en iyi yol ve grepile birlikte kullanmaktır . İlk önce, istenen dizginin bulunduğu satırı almak için grep kullanın ( satır numarasını gösterir; ilk maçtan sonra aramayı durdurmak için):cuttail-n-m 1

grep -n -m 1 "somestring" filename.txt

Bu satır numarasını ve dizenin kendisini çıkarır. Dizeyi kesmek için, cut ( -f1: output first field ;; -d:":" sınırlayıcı olarak kullanın):

grep -n -m 1 "somestring" filename.txt | cut -f1 -d:

Sonra, bu komutun çıktısını kuyrukta parametre olarak kullanırız. Normalde, kuyruk son k satırlarını yazdırır, ancak kullanarak -n +k, k satırından itibaren yazdırmak için kuyruk alırız. Toplam komut:

tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt

Çıkış için hatlar kadar somestringkullanım headyerine tailve -n -#yerine -n +#. Ayrıca, her ikisini de satırları bir dizeden diğerine almak için birleştirebilirsiniz.


0

Lütfen aşağıdaki kodu deneyin -

sed -n '6,$p' infile

3
Komutu açıklamak için cevabınızı genişleterek bunu "öğretilebilir bir an" haline getirebilir misiniz? Teşekkürler.
fixer1234

1
Bu, ilk önce OP tarafından belirtilen koşulları dikkate almaz ve (değişiklikten sonra bile) ikinci soruna cevap vermez: "2A" satırından "A" içeren bir sonraki satıra kadar .
Techraf

0

Sed yöntemi, gidilecek yoldur, ancak üst çizgileri korumak, ancak onları grep etmek istemezseniz ne olur?

İşte bir yol:

{ head -1 file.txt ; sed 1d file.txt | grep <whatever> ;}

Burada neler oluyor?

İlk önce üst satırı tükürdük (head -1 file.txt) Sonra, üst satırı kaldırdık (sed 1d file.txt) ve tam olarak grep.

Her şey {..;} ile sarılıdır, böylece daha sonra hem başlığı hem de ızgara gövdesini birleştirebilir veya yeniden yönlendirebilirsiniz. Bunun gibi:

{head -1 file.txt; sed 1d dosyası.txt | grep;}> newfile.txt

İlk 10 satırı atlamak istiyorsanız, bunu değiştirin.

{head -10 file.txt; sed 1,10d dosya.txt | grep;}

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.