grep un fișier, dar arată mai multe linii înconjurătoare?

Aș dori să grep pentru un șir, dar să arăt, de asemenea, cele cinci linii precedente și următoarele cinci linii, precum și linia potrivită. Cum aș putea să fac asta?

0
fr hi bn
Pentru o soluție care funcționează pe Solaris, consultați acest link .
adăugat autor jahroy, sursa
man grep | grep -C 1 "\ -C" ;)
adăugat autor Anders B, sursa
Păstrez o copie a scriptului Perl al lui Brendan Gregg pentru acest scop. Lucrează bine.
adăugat autor Ethan Post, sursa
man grep | contextul grep -C 1 :)
adăugat autor StvnW, sursa

9 răspunsuri

grep astring myfile -A 5 -B 5

Acest lucru va însemna "myfile" pentru "astring" și va arăta 5 linii înainte și după fiecare meci

0
adăugat
"myfile astringent grep-C 5" va face la fel
adăugat autor Syed Siraj Uddin, sursa

Eu folosesc în mod normal

grep searchstring file -C n # n for number of lines of context up and down

Multe dintre instrumentele de genul grep au, de asemenea, fișiere foarte mari ale omului. Mă găsesc referindu-mă la pagina grep's man pentru că există atât de mult puteți face cu asta.

man grep

Multe instrumente GNU au, de asemenea, o pagină de informații care poate avea mai multă utilitate informații în plus față de pagina man.

info grep
0
adăugat

ack works with similar arguments as grep, and accepts -C. But it's usually better for searching through code.

0
adăugat
Ack este mai bun decât grep în multe feluri. E mai rapid cu o sintaxă mai simplă.
adăugat autor chim, sursa
ack sprijină, de asemenea, -A-B.
adăugat autor Shuo, sursa

Here is the @Ygor solution in 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ă: Înlocuiți variabilele a și b cu numărul de linii înainte și după.

Este folositor în special pentru sistemul care nu acceptă parametrii -A , -B și -C grepului.

0
adăugat

ripgrep

If you care about the performance, use ripgrep which has similar syntax to grep, e.g.

rg -C5 "pattern" .

-C , - NUM context - Afișați NUM linii înainte și după fiecare potrivire.

Există, de asemenea, parametri precum -A / - după context și -B / >.

Instrumentul este construit pe partea de sus a motorului Ruse de regex care îl face foarte eficient pe datele mari.

0
adăugat

Utilizați 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
0
adăugat
Îmi pare rău Yokai. Dar eu nu citesc nimic despre greparea secțiunii de ajutor din grep pentru a prelua răspunsul.
adăugat autor Chiel ten Brinke, sursa
Nu ați citit răspunsul acceptat? Doar repetați ceea ce sa spus deja într-o întrebare de aproape 10 ani ...
adăugat autor Yokai, sursa

Pentru BSD sau GNU grep puteți folosi -B num > -A num pentru numărul de linii după meci.

grep -B 3 -A 2 foo README.txt

Dacă doriți același număr de linii înainte și după ce puteți folosi -C num .

grep -C 3 foo README.txt

Aceasta va afișa 3 linii înainte și 3 linii după.

0
adăugat
Solaris grep nu acceptă acest lucru. Dar gnu grep susține Solaris.
adăugat autor guettli, sursa
Este bine, dar, din păcate, grefa Solaris nu susține asta. Vedeți acel link pentru Solaris: unix.com/ solaris/33533-grep-display-câteva linii-înainte-after.h & zwnj; tml
adăugat autor рüффп, sursa
Ok, dar dacă doriți să afișați toate liniile de ieșire după meci? grep -A0 și grep -A-1 nu-l taie ...
adăugat autor g33kz0r, sursa
@ g33kz0r, în acest caz ar trebui să întrebați într-o întrebare separată. (Chiar dacă cineva a greșit să vă răspundă aici, mă bate de ce ...)
adăugat autor alexis, sursa
Dacă sunteți HP-UX env, niciuna dintre versiunile grep nu va funcționa ca în Solaris. A reușit să utilizeze linkul Solaris, dar să înlocuiască nawk cu awk în acel link.
adăugat autor zkarthik, sursa
ruffp: cred că există și GNUgrep
adăugat autor Mailo, sursa
nu funcționează pentru mine din vreun motiv, deși este menționat în paginile mele despre om.
adăugat autor Hayri U?ur Koltuk, sursa
-n este pentru numerele de linie, dar pentru unele versiuni ale grep -n # se vor afișa # linii înconjurătoare (ca -c) cu numere de linie. Aceasta este o scurtătură utilă pe care o fac când am nevoie de context.
adăugat autor Anthony DiSanti, sursa
Aceasta funcționează și pe "Bash on Ubunutu on Windows"! Subsistemul Windows pentru Linux utilizează Ubuntu 14.04.4 LTS de la această scriere.
adăugat autor Adam Venezia, sursa

-A and -B will work, as will -C n (for n lines of context), or just -n (for n lines of context).

0
adăugat
+1 - -5 este mai rapid să tastați decât -A 5 -B 5
adăugat autor mouche, sursa

Căutați "17655" în "/some/file.txt" care prezintă 10 rânduri înainte și după (folosind Awk), ieșirea precedată de numărul liniei urmat de un colon. Utilizați acest lucru pe Solaris atunci când "grep" nu acceptă opțiunile "- [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;
0
adăugat
SEO - optimizare, România & Moldova
SEO - optimizare, România & Moldova
120 participanți

Pentru confort, opriți notificările. Parteneri: ciupacabra.com Toate grupurile IT: @Grupuri_IT