Tidak ada yang salah dengan dua jawaban sebelumnya, tetapi saya pikir saya akan membuat Anda sadar bahwa menemukan baris ketiga setelah sebuah pola dapat dilakukan dalam satu sed
panggilan:
sed -n "/four/ { n; n; p }" SourceData.txt
Karena satu program berfungsi, ini lebih efisien daripada menjalankan banyak filter. Perintah di atas menampilkan baris ketiga setelah setiap instance dari "empat", kecuali jika ini terjadi lagi di salah satu dari dua baris setelah kecocokan (solusi lain juga tidak menangani kasus ini dengan cara yang diharapkan); juga, tidak ada keluaran yang dihasilkan jika pola berada di baris terakhir atau kedua dari file, yang mungkin atau mungkin bukan yang Anda inginkan.
Untuk mencocokkan contoh pertama saja:
sed -n "/four/ { n; n; p; q }" SourceData.txt
(Perhatikan bahwa jawaban ini seefisien mungkin, dengan mengakhiri pemindaian segera setelah kecocokan ditemukan.)
Saya menambahkan solusi ini karena sangat berharga untuk mengenal sed
dan, meskipun sintaksnya agak tidak tepat (ekspresi reguler sudah cukup buruk!), seringkali bisa sangat berguna. Tutorial ini adalah pengantar yang bagus.
Solusi ini mencetak baris saat ini jika ada kecocokan dua baris yang lalu. Ini sedikit berbeda dari beberapa jawaban lainnya karena tidak akan melewatkan pertandingan lain meskipun terjadi segera setelah pertandingan sebelumnya.
awk -v delay=2 '{for (i=delay; i>=0; i--) t[i]=t[i-1]} /four/ {t[0]="m"} {if (t[delay]) print}'
Setiap kali ada kecocokan, informasi disimpan di t[0]
. Dengan setiap baris t
array digeser (termasuk menggeser t[-1]
ke t[0]
untuk mengatur ulang nilai t[0]
). Baris dicetak jika larik menunjukkan ada kecocokan dua baris yang lalu.
Anda dapat dengan mudah menyetel penundaan yang berbeda (mis. delay=7
) atau gunakan pola lain (mis. /sda[[:digit:]]/
)
Anda dapat menggunakan ungkapan ini (input.txt
):
grep "four" -A 2 input.txt | tail -n 1
Keluarannya adalah:
six 6
grep
opsi "-A 2" menyatakan bahwa dua baris setelah baris yang cocok akan ditampilkan.
Dan tail
opsi "-n 1" menyatakan bahwa hanya 1
terakhir baris dari hasil ini dikembalikan.