Saya ingin "grep" dari "baris 2A" ke akhir file:
sed -n '/2A/,$p'
- -n :menekan
sed
keluaran 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.