Saya ingin "grep" dari "baris 2A" ke akhir file:
sed -n '/2A/,$p'
- -n :menekan
sedkeluaran bawaan - /2A/ :baris output dari yang pertama berisi "2A"
- $ :ke akhir file
Saya ingin "grep" dari "baris 2A" ke baris berikutnya yang berisi "A":
sed -n '/2A/,/A/p'
- /A/ :output sampai baris berisi "A"
Saya ingin "grep" dari baris pertama yang berisi "A" ke baris berikutnya:
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
(diperluas dari komentar)
awk memiliki kemampuan untuk memilih 'rentang' garis yang cocok dengan kebutuhan ini dengan sempurna, seperti yang dijelaskan dalam manual GNU-awk (gawk). (Fitur ini berfungsi di awk lainnya tapi gawk manual mudah ditautkan.)
awk '/line 2A/,0' mencetak baris dimulai dengan yang pertama yang cocok dengan line 2A dan berlanjut sampai akhir input karena 0 adalah kondisi yang tidak pernah benar.
awk '/line 2A/,/A/&&!/line 2A/' mulai mencetak dengan baris yang cocok dengan line 2A dan berhenti setelah baris yang cocok dengan A tapi BUKAN line 2A (dan dengan demikian tidak bisa menjadi garis yang sama dengan garis start). Ini akan dimulai lagi pada selanjutnya line 2A dan seterusnya; jika Anda ingin mencegahnya, ada cara yang sedikit lebih rumit untuk melakukannya.
Jika garis pemberhentian selalu memiliki beberapa karakter selain 2 sebelum A ini dapat disederhanakan menjadi awk '/line 2A/,/[^2]A/' yang berhenti setelah baris yang cocok dengan karakter apa pun selain 2, diikuti oleh A. Anda mungkin menginginkan variasi dari ini, mis. untuk berhenti pada setiap-satu-digit-A yang berbeda dari 2A, tetapi bukan yang lain seperti WHAT; untuk itu kondisi berhenti mungkin ,/line [013-9]A/ .
Saya pikir cara terbaik adalah menggunakan grep dikombinasikan dengan cut dan tail . Pertama, gunakan grep untuk mendapatkan baris di mana string yang diinginkan (-n ke nomor baris keluaran; -m 1 untuk berhenti mencari setelah pertandingan pertama):
grep -n -m 1 "somestring" filename.txt
Ini menampilkan nomor baris dan string itu sendiri. Untuk memotong string, kami menggunakan cut (-f1 :menampilkan kolom pertama; -d: gunakan ":" sebagai pembatas):
grep -n -m 1 "somestring" filename.txt | cut -f1 -d:
Selanjutnya, kami menggunakan output dari perintah ini sebagai parameter di ekor. Biasanya, tail mencetak k baris terakhir, tetapi menggunakan -n +k , kita mendapatkan ekor untuk dicetak dari garis k dan seterusnya. Perintah totalnya adalah:
tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt
Untuk menampilkan baris hingga somestring gunakan head bukannya tail dan -n -# bukannya -n +# . Anda juga dapat menggabungkan keduanya untuk mendapatkan baris dari satu string ke string lainnya.