Ben grep
bir dize için istiyorum , ama aynı zamanda önceki beş satır ve aşağıdaki beş satır yanı sıra eşleşen çizgi göstermek. Bunu nasıl yapabilirim?
man grep | grep -C 1 context
:)
man grep | grep -C 1 "\-C"
;)
Ben grep
bir dize için istiyorum , ama aynı zamanda önceki beş satır ve aşağıdaki beş satır yanı sıra eşleşen çizgi göstermek. Bunu nasıl yapabilirim?
man grep | grep -C 1 context
:)
man grep | grep -C 1 "\-C"
;)
Yanıtlar:
İçin BSD veya GNU grep
kullanabilirsiniz -B num
maç öncesi ve kaç satırları ayarlamak için -A num
maçtan sonra çizgilerin sayısı için.
grep -B 3 -A 2 foo README.txt
İsterseniz önce ve sonra aynı sayıda satır kullanabilirsiniz -C num
.
grep -C 3 foo README.txt
Bu önce 3 satır sonra 3 satır gösterir.
-A
ve -B
irade gibi çalışacaktır -C n
(için n
sadece veya bağlamsal satır) -n
(için n
sürece n 1'den 9'a kadar olan ... bağlamın çizgiler).
-n
Biçimi denedim ve sadece şu ana kadar çalıştığını öğrendim 9
. Bunun için 15
5 satır döndürür
-A
, -B
ya da -C
). Genellikle, seçenek -o a.out
tanımlayıcısının ardından bir değer gelir ( GCC'de çıktı dosyasını belirtmek için), ancak aynı zamanda basit bir anahtar / işaret olarak da işlev görebilir ( -g
GCC'de hata ayıklama bilgilerini etkinleştirmek için). Ancak seçenekler arasındaki boşluklar isteğe bağlıdır, bu nedenle değeri olmayan seçenekler için bunları ( -ABC
) birleştirmek mümkündür , bu -15
da yorumlanır -1 -5
(iki ayrı seçenek) ve -5
geçersiz kılınır -1
.
ack , grep ile benzer argümanlarla çalışır ve kabul eder -C
. Ancak genellikle kod aracılığıyla arama yapmak daha iyidir.
grep
" ack
gerçekten harika bir araçtır " "reklam" için kullanmak emin değilsiniz iyi bir fikir ...
grep astring myfile -A 5 -B 5
Bu, "astring" için "dosyam" ı gecek ve her maçtan önce ve sonra 5 satır gösterecek
Normalde kullanırım
grep searchstring file -C n # n for number of lines of context up and down
Grep gibi araçların birçoğu da gerçekten harika adam dosyalarına sahiptir. Kendimi grep'in man sayfasına çok atıfta bulunuyorum çünkü onunla yapabileceğiniz çok şey var.
man grep
Birçok GNU aracı ayrıca kılavuz sayfasına ek olarak daha yararlı bilgiler içerebilecek bir bilgi sayfasına da sahiptir .
info grep
Grep kullan
$ 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
"17655" için "/some/file.txt" dosyasında arama yapmadan önce ve sonra 10 satır bağlamı (Awk kullanarak), çıktıdan önce satır numarası ve ardından iki nokta üst üste gelir. 'Grep' "- [ACB]" seçeneklerini desteklemediğinde bunu Solaris'te kullanın.
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
Performansı önemsiyorsanız, ripgrep
sözdizimine benzer bir grep
örnek kullanın , ör.
rg -C5 "pattern" .
-C
,--context NUM
- Her maçtan önce ve sonra NUM satır göster.
-A
/ --after-context
Ve -B
/ gibi parametreler de vardır --before-context
.
Araç, büyük verilerde çok verimli olmasını sağlayan Rust'un normal regex motorunun üzerine inşa edilmiştir .
İşte @Ygor çözümü içindeawk
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
Not: Değiştir a
ve b
çizgilerin sayısı ile değişkenleri öncesi ve sonrası.
Bu grep 's desteklemeyen sistem için özellikle yararlıdır -A
, -B
ve -C
parametreleri.
Sık sık kod ararsanız, AG gümüş arayıcı grep'ten çok daha verimlidir (yani daha hızlı).
Bağlam satırlarını -C seçeneğini kullanarak gösterirsiniz.
Örneğin:
ag -C 3 "foo" myFile
line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7