Soru Bir dosyayı grep, ancak birkaç çevreleyen çizgileri göster?


isterim grep Bir dize için, ancak önceki beş satırı ve takip eden beş satırı ve aynı zamanda eşleşen çizgiyi gösterir. Bunu nasıl yapabilirim?


2756
2017-08-12 17:55


Menşei


Bir kopyasını saklıyorum Brendan Gregg'in perl betiği bu amaç için. İyi çalışıyor. - Ethan Post
Solaris üzerinde çalışan bir çözüm için, kontrol edin bu bağlantı. - jahroy
man grep | grep -C 1 context :) - StvnW
man grep | grep -C 1 "\-C" ;) - Anders B


Cevaplar:


İçin BSD veya GNU  grep kullanabilirsiniz -B num maçtan önce kaç satır ve -A num maçtan sonraki hatların sayısı için.

grep -B 3 -A 2 foo README.txt

Eğer kullanabilmeniz için önce ve sonra aynı sayıda çizgi istiyorsanız -C num.

grep -C 3 foo README.txt

Bu 3 satır önce ve 3 satır sonra gösterecektir.


3679
2017-08-12 17:57



İyi 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 - рüффп
Tamam, ama ya göstermek istersen herşey maçtan sonra çıkış hatları? grep -A0 ve grep -A-1 kesmiyor ... - g33kz0r
benim adam sayfalarında belirtilmiş olmasına rağmen, benim için herhangi bir nedenden dolayı çalışmıyor. - Hayri Uğur Koltuk
HP-UX env iseniz, grep sürümlerinden hiçbiri Solaris'te çalışamaz. Solaris bağlantısını kullanabildi, ancak bu linkte nawk ile awk'yi değiştirdi. - zkarthik
-n satır numaraları içindir, ancak grep -n # 'nin bazı sürümlerinde satır numaraları ile # çevreleyen çizgiler (-c gibi) gösterilecektir. Bu, içeriğe gereksinim duyduğumda benim için yararlı bir kısayol. - Anthony DiSanti


-A ve -B olacak, çalışacak -C n (için n bağlam çizgileri) veya sadece -n (için n bağlam çizgileri).


520
2017-08-12 17:59



+1 - -5 yazmaktan daha hızlıdır -A 5 -B 5 - mouche


ack grep ile benzer argümanlar ile çalışır ve kabul eder -C. Ancak genellikle kod aramak için daha iyidir.


66
2017-09-07 11:13



ack ayrıca -A-B'yi de destekler. - Shuo
Ack, pek çok açıdan grep'ten daha iyidir. Daha basit bir sözdizimi ile daha hızlı. - chim


grep astring myfile -A 5 -B 5

Bu "astring" için "myfile" grep olacak ve her maçtan önce ve sonra 5 satır gösterecek


32
2017-08-12 17:58



"grep astring myfile -C 5" aynısını yapacak - Syed Siraj Uddin


Normalde kullanıyorum

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 insan dosyalarına sahip. Kendimi kastediyorum grep'in adam sayfası Çok fazla çünkü onunla yapabileceğin çok şey var.

man grep

Birçok GNU aracında ayrıca bilgi sayfası Bu adam sayfasına ek olarak daha yararlı bilgilere sahip olabilir.

info grep

16
2017-08-12 18:42





"/Some/file.txt" dosyasında "/some/file.txt" ifadesini, 10 satırlık bağlamı önce ve sonra (Awk kullanarak), satır numarası ve ardından bir virgülle gösteren çıktı olarak arayın. '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;

8
2017-10-08 00:21





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

5
2018-01-12 11:25



Kabul edilen cevabı okumadınız mı? Neredeyse 10 yaşında bir soruda zaten söylenenleri tekrarlıyorsunuz ... - Yokai
Ah üzgünüm Yokai. Ama cevabı almak için grep'in yardım bölümünü bozma konusunda hiçbir şey okumadım. - Chiel ten Brinke


ripgrep

Performansı önemsiyorsanız, kullanın ripgrep benzer sözdizimine sahip olan grep, Örneğin.

rg -C5 "pattern" .

-C, --context NUM - Her maçtan önce ve sonra NUM satırını göster.

Gibi parametreler de vardır -A/--after-context ve -B/--before-context.

Araç üstüne inşa edilmiştir Rust'un düzenli ifade motoru onu çok yapan verimli büyük veri üzerinde.


2
2018-04-11 10:28





İşte @Ygor çözümü içinde awk

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ştirin a ve b Önceden ve sonra satır sayısı ile değişkenler.

Grep'i desteklemeyen sistem için özellikle yararlıdır. -A, -B ve -C parametreleri.


0
2018-04-11 10:24