grep -A1 "valami" hatásrára érdekes sorok jelnnek meg....

 ( kanyi | 2012. február 21., kedd - 15:41 )

Sziasztok!

Ez lenne a parancs. grep -A1 "valami"

Ha valaki használta már így a grepet, meg tudná mondani, hogy miért van az hogy helyenként beszúr egy-egy sort? Amiben láthatóan csak két jel van: --

Megcsinálja rendesen a szűrést, és hozzáadja ugye az -A1-nek megfelelő +1 sort, meg plusz még néha néhányat. grep "valami" még teljesen jó eredményt ad. Próbáltam Debianon és Ubuntun is ugyan ez az eredmény. Egy Java Scriptes .html oldallal lenne a gond, amit lynx-el töltök le. Addig rendben is van a dolog, még simán a grep is jó -A1 nélkül.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

man grep

A -A1 azt jelenti, hogy a talalati sor utan meg 1 sort kiir.

Tehat egy talalathoz 2 sor tartozik: a talalati sor, es az utanajovo.
Ha az inputban tobb talalat is van, akkor ez tobbszor ismetlodik meg.
A "^--$" pedig elvalasztja ezeket a talalati csoportokoat.

Ahogy azt a grep manualja irja:

-A NUM, --after-context=NUM

Print NUM lines of trailing context after matching lines.
Places a line containing a group separator (--) between
contiguous groups of matches.

Elso otlet lenne utanabiggyeszteni egy grep -v "^--$" parancsot, de lehetseges, hogy az inputban is van ilyen, es az kell.

az alabbi parancs majdnem ezt csinalja:

awk '/valami/{print; getline print}'

az vele a baj, hogyha a kovetkezo sorban is van talalat, akkor nem irja ki a rakovetkezo sort.

Az alabbi megoldas teljesen jo, azonban tul bonyi ;)

awk '/valami/{print; do{if(0 >= getline)exit; print; }while( $0 ~ /valami/) }'

Kösz. :)
Megy. De tényleg bonyi egy picit...

Nekem ez áttekinthetőbbnek tűnik, és még karakterre sem hosszabb, sőt:

awk '/valami/ { print ; Found=1 ; next ; } Found == 1 { print ; Found = 0 }'

Legalábbis pár triviális tesztben azt adja, mint a grep -A1

ügyes!

Na ja :-)

Lényegében az én megoldásom is ezt csinálja csak kevesebb karakterrel :)

Sajnos a tied rosszul működk abban az esetben, ha pl. két egymást követő sorban találat van, és utána van más - nem találat sor is (ezt a harmadik sort nem írod ki, mert hiányzik az "én" awk-omnak a második feltétele) a sedes játékból. Amúgy igen, néztem, de csak rápillantottam és csak most veséztem ki. :-) Arról már nem is beszélve :-), hogy kell egy pontosvessző pluszban a záró print után is, ha egy sorba akarjuk írni a záró kacsacsőrrel. A GNU sed elfogadja így is, ellenben a szintaxis szerint kellene (FreeBSD sed nem eszi meg, GNU sed megeszi).

Szerk: szerintem sed-del is megoldható jól (ezzel az algoritmussal), ott is van elágaztató művelet, de ahhoz most nem érzem magam kellően perverznek.

Szerk2: most veszem észre, hogy ezt a speciális esetet (találat; találat; nem-találat) Egerész első hozzászólásában külön kiemelte.

Valóban. Na, akkor a sed-be még egy kicsit jobban beleásom magam...

Amikor CSA tartotta (elte) a unix bevezetőt, akkor brahiztunk néha, hogy egy beadandó feladat (általános kezdő shellscript):
megoldható-e csak sed -del.
megoldható-e csak egyetlen pipeline -nal
megoldható-e csak egyetlen pipeline-nal, és benne csak sed-del
megoldható-e csak egyetlen sed -del.

Ha szövegfeldolgozás volt, akkor általában igen, jó kis write-only sed programocskák születettek ;)

Igen, én is egyre inkább tapasztalom, hogy jó anyag ez a sed, csak sosincs időm eleget foglalkozni vele...

Egy nagyon egyszerű megoldás:
sed -n "/minta/{p;n;p}"