Saya ingin grepstring, tetapi juga menunjukkan lima baris sebelumnya dan lima baris berikut serta garis yang cocok. Bagaimana saya bisa melakukan ini?
man grep | grep -C 1 context:)
man grep | grep -C 1 "\-C";)
Saya ingin grepstring, tetapi juga menunjukkan lima baris sebelumnya dan lima baris berikut serta garis yang cocok. Bagaimana saya bisa melakukan ini?
man grep | grep -C 1 context:)
man grep | grep -C 1 "\-C";)
Jawaban:
Untuk BSD atau GNU grep Anda dapat menggunakan -B numuntuk mengatur berapa baris sebelum pertandingan dan -A numuntuk jumlah baris setelah pertandingan.
grep -B 3 -A 2 foo README.txt
Jika Anda ingin jumlah baris yang sama sebelum dan sesudah Anda dapat menggunakan -C num.
grep -C 3 foo README.txt
Ini akan menampilkan 3 baris sebelum dan 3 baris setelah.
-Adan -Bakan bekerja, seperti yang akan -C n(untuk ngaris konteks), atau adil -n(untuk ngaris konteks ... selama n adalah 1 hingga 9).
-nformat dan ternyata hanya berfungsi sampai 9. Untuk 15itu mengembalikan 5 baris
-A, -Batau -C). Biasanya, specifier opsi diikuti oleh nilai ( -o a.outuntuk menentukan file output di GCC), tetapi juga dapat berfungsi sebagai saklar / bendera sederhana ( -guntuk mengaktifkan info debug di GCC). Namun spasi di antara opsi bersifat opsional, jadi untuk opsi tanpa nilai, dimungkinkan untuk menggabungkannya ( -ABC), yang berarti -15ditafsirkan -1 -5(dua opsi terpisah) dan -5mengabaikannya -1.
ack bekerja dengan argumen yang sama dengan grep, dan accept -C. Tetapi biasanya lebih baik untuk mencari melalui kode.
grep, tidak yakin menggunakannya untuk "beriklan" ack(yang merupakan alat yang hebat, memang) adalah ide yang bagus ...
grep astring myfile -A 5 -B 5
Itu akan menangkap "myfile" untuk "astring", dan menunjukkan 5 baris sebelum dan sesudah setiap pertandingan
Saya biasanya menggunakan
grep searchstring file -C n # n for number of lines of context up and down
Banyak alat seperti grep juga memiliki file man yang sangat hebat. Saya menemukan diri saya banyak merujuk ke halaman manual grep karena ada banyak hal yang dapat Anda lakukan dengannya.
man grep
Banyak alat GNU juga memiliki halaman info yang mungkin memiliki informasi yang lebih berguna selain halaman manual.
info grep
Gunakan grep
$ grep --help | grep -i context
Context control:
-B, --before-context=NUM print NUM lines of leading context
-A, --after-context=NUM print NUM lines of trailing context
-C, --context=NUM print NUM lines of output context
-NUM same as --context=NUM
Cari "17655" di "/some/file.txt" menampilkan 10 baris konteks sebelum dan sesudah (menggunakan Awk), output diawali dengan nomor baris diikuti oleh titik dua. Gunakan ini pada Solaris ketika 'grep' tidak mendukung opsi "- [ACB]".
awk '
/17655/ {
for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
print before[i]
}
print (NR ":" ($0))
a = 10
}
a-- > 0 {
print (NR ":" ($0))
}
{
before[b] = (NR ":" ($0))
b = (b + 1) % 10
}' /some/file.txt;
ripgrepJika Anda peduli dengan kinerja, gunakan ripgrepsintaksis yang mirip dengan grep, misalnya
rg -C5 "pattern" .
-C,--context NUM- Tampilkan NUM baris sebelum dan sesudah setiap pertandingan.
Ada juga parameter seperti -A/ --after-contextdan -B/ --before-context.
Alat ini dibangun di atas mesin regex Rust yang membuatnya sangat efisien pada data besar.
Ini adalah solusi @ Tech diawk
awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile
Catatan: Ganti adan bvariabel dengan jumlah baris sebelum dan sesudah.
Ini sangat berguna untuk sistem yang tidak mendukung parameter grep -A, -Bdan -C.
Jika Anda sering mencari kode, AG pencari perak jauh lebih efisien (lebih cepat) daripada grep.
Anda menunjukkan garis konteks dengan menggunakan opsi -C.
Misalnya:
ag -C 3 "foo" myFile
line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7