bir dosya grep, ancak birkaç çevreleyen satır göster?


3418

Ben grepbir 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?


3
Brendan Gregg'in perl betiğinin bir kopyasını bu amaçla saklıyorum. İyi çalışıyor.
Ethan Post

6
Solaris üzerinde çalışan bir çözüm için bu bağlantıya göz atın .
jahroy

106
man grep | grep -C 1 context:)
StvnW

20
man grep | grep -C 1 "\-C";)
Anders B

9
@StvnW ... Ben öyle hitap mi bilmiyorum meta (yerine SO bağlamında yerine, daha genel olarak), ya da ne onu aramak için. Cevabı bulmak için cevabı nasıl kullanacağınızı göstererek soruyu cevapladınız.
bballdave025

Yanıtlar:


4537

İçin BSD veya GNU grep kullanabilirsiniz -B nummaç öncesi ve kaç satırları ayarlamak için -A nummaç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.


56
Güzel ama ne yazık ki Solaris grep bunu desteklemiyor. Solaris için şu bağlantıya bakın: unix.com/solaris/33533-grep-display-few-lines-before-after.html
рüффп

9
Tamam, ama maçtan sonra tüm çıkış çizgilerini göstermek istersen ? grep -A0 ve grep -A-1 kesmeyin ...
g33kz0r

2
benim adam sayfalarımda belirtilse de, bir sebepten dolayı benim için çalışmıyor.
Hayri Uğur Koltuk

2
HP-UX env iseniz, grep sürümlerinin hiçbiri Solaris'de olduğu gibi çalışmaz. Solaris bağlantısını kullanabildim ama bu linkte awk ile nawk'ı değiştirebildim.
zkarthik

6
-n satır numaraları içindir, ancak grep'in bazı sürümleri için -n # satır numaralarıyla # çevreleyen satırları (-c gibi) gösterir. Bağlama ihtiyaç duyduğumda kullanacağım yararlı bir kısayol.
Anthony DiSanti

607

-Ave -Birade gibi çalışacaktır -C n(için nsadece veya bağlamsal satır) -n(için nsürece n 1'den 9'a kadar olan ... bağlamın çizgiler).


-nBiçimi denedim ve sadece şu ana kadar çalıştığını öğrendim 9. Bunun için 155 satır döndürür
Deepak Mahakale

7
@DeepakMahakale Bu muhtemelen komut satırı argümanlarının / seçeneklerinin tipik olarak POSIX programları tarafından nasıl ayrıştırıldığıyla ilgilidir. Seçenek belirteci tek bir karakter (örneğin olduğu gibi -A, -Bya da -C). Genellikle, seçenek -o a.outtanı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 ( -gGCC'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 -15da yorumlanır -1 -5(iki ayrı seçenek) ve -5geçersiz kılınır -1.
natiiix

1
-5, -A 5 -B 5'ten daha hızlıdır. Bunların birlikte kullanılması amaçlanmamıştır. -A veya -B veya -9 üzeri -C'yi seçerseniz, komut dosyasının diğer okuyucuları için daha temiz olur.
Eric Aldinger

76

ack , grep ile benzer argümanlarla çalışır ve kabul eder -C. Ancak genellikle kod aracılığıyla arama yapmak daha iyidir.


5
ack ayrıca -A -B'yi de destekler.
Shuo

Ack, birçok yönden grep'ten daha iyidir. Daha basit bir sözdizimi ile daha hızlıdır.
chim

1
grep, birçok sistemde varsayılan olarak kurulma avantajına sahiptir.
Marc Z

1
@MarcZ: Doğru, grep'in varsayılan olarak ack'ten daha fazla yüklenmesi muhtemeldir, ancak ack taşınabilir, bağımsız bir komut dosyasıdır. Derlemeye veya / usr / bin / gibi bir sistem dizinine kurmaya gerek yoktur. İndirildikten ve $ PATH'de (ve eXecute izin biti kümesi) listelenen bir dizine yerleştirildikten sonra hemen çalışması gerekir. (İşe yaramak için sudo veya kök ayrıcalıklarına gerek yoktur.)
JL

Bu soru, grep" ackgerçekten harika bir araçtır " "reklam" için kullanmak emin değilsiniz iyi bir fikir ...
MonsieurDart

39
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


19
"grep astring myfile -C 5" aynısını yapacağız
Syed Siraj Uddin

20

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

13

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

Kabul edilen cevabı okumadınız mı? Neredeyse 10 yaşında bir soruda söylenenleri tekrarlıyorsunuz ...
Yokai

7
Üzgünüm Yokai. Ama cevabı almak için grep'in yardım bölümünü selamlama hakkında hiçbir şey okumam.
Chiel ten Brinke

1
@Yokai Chiel ten Brinke'nin söylediklerinin yanı sıra, kabul edilen cevap uzun seçeneklerden bahsetmiyor
user3738870

10

"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;

7

ripgrep

Performansı önemsiyorsanız, ripgrepsö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-contextVe -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 .


5

İş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 ave bçizgilerin sayısı ile değişkenleri öncesi ve sonrası.

Bu grep 's desteklemeyen sistem için özellikle yararlıdır -A, -Bve -Cparametreleri.


4
$ grep thestring thefile -5

-55maçın üstündeki ve altındaki satırları alırsa , 'thestring' -C 5veya ' ya eşdeğerdir -A 5 -B 5.


4

Grep adlı bir seçenek var Context Line Control, bunu kullanabilirsiniz --context, basitçe,

| grep -C 5

veya

| grep -5

Hile yapmalı


1

Kompakt yolu yapmak için kullanıyorum

grep -5 string file

Bu eşdeğerdir

grep -A 5 -B 5 string file

0

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.