Saya ingin grep
string, 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 grep
string, 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 num
untuk mengatur berapa baris sebelum pertandingan dan -A num
untuk 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.
-A
dan -B
akan bekerja, seperti yang akan -C n
(untuk n
garis konteks), atau adil -n
(untuk n
garis konteks ... selama n adalah 1 hingga 9).
-n
format dan ternyata hanya berfungsi sampai 9
. Untuk 15
itu mengembalikan 5 baris
-A
, -B
atau -C
). Biasanya, specifier opsi diikuti oleh nilai ( -o a.out
untuk menentukan file output di GCC), tetapi juga dapat berfungsi sebagai saklar / bendera sederhana ( -g
untuk mengaktifkan info debug di GCC). Namun spasi di antara opsi bersifat opsional, jadi untuk opsi tanpa nilai, dimungkinkan untuk menggabungkannya ( -ABC
), yang berarti -15
ditafsirkan -1 -5
(dua opsi terpisah) dan -5
mengabaikannya -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;
ripgrep
Jika Anda peduli dengan kinerja, gunakan ripgrep
sintaksis 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-context
dan -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 a
dan b
variabel dengan jumlah baris sebelum dan sesudah.
Ini sangat berguna untuk sistem yang tidak mendukung parameter grep -A
, -B
dan -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