Olyan postaládás fájlt elemzek, amely sikertelenül kézbesített e-mail szerver jelentéseket tárol. Szeretném kibontani a rossz e-mail címeket, ezért hogy eltávolítom őket a rendszerből. A naplófájl a következőképpen néz ki:

...some content... The mail system <[email protected]>: host mx1.hotmail.com[65.54.188.94] said: 550 Requested action not taken: mailbox unavailable (in reply to RCPT TO command) ...some content... The mail system <[email protected]>: host viking.optimumpro.net[79.101.51.82] said: 550 Unknown user (in reply to RCPT TO command) ...some content... The mail system <[email protected]>: host mta5.am0.yahoodns.net[74.6.140.64] said: 554 delivery error: dd This user doesn"t have a yahoo.com account ([email protected]) [0] - mta1172.mail.sk1.yahoo.com (in reply to end of DATA command) ...etc. 

Az e-mail cím 2 sorral jelenik meg a “Levelezőrendszer” sor után. . Az ilyen grep használatával megkapom az “A levelezőrendszer” sort és a következő két sort:

grep -A 2 "The mail system" mbox_file 

Azonban nem tudom, hogyan távolítsam el a “A levelezőrendszer” sor és a második üres sor erről a kimenetről. Azt hiszem, írhatnék PHP / Perl / Python szkriptet, de kíváncsi vagyok, hogy ez lehetséges-e a grep-kel vagy más szabványos eszközzel. Megpróbáltam negatív eltolást adni a -B paraméternek:

grep -A 2 -B -2 "The mail system" mbox_file 

De a grep panaszkodik:

grep: -2: invalid context length argument 

Van rá mód a grep használatával?

Megjegyzések

  • -B úgy fogadja el a számot, mint az -A, és ez a korábbi sorok a meccs előtt.
  • Igen, ez igaz, de Milánó nem ' nem érdekli, hogy mi előzte meg a mérkőzést .. . Az a probléma, amellyel találkozott, hogy -A és -B csak pozitív értékeket fogadnak el … és hogy -A és -B mindenesetre ' t egymáshoz viszonyítva nem használhatók , ahogyan megpróbálta.
  • Hum, csak azért, hogy megbizonyosodjak róla: ezek olyan dummy címek, amelyeket nem (közvetlenül) vettél ki a kapott fájlból, igaz?
  • @Matthieu M. nem, valódi naplófájlból származnak. Arra gondoltam, hogy amúgy is érvénytelen címek, mi az a ' az a pont, hogy feltaláljuk az esetleg érvénytelen címeket.
  • stackoverflow.com/questions/8101701/…

Válasz

Csak grep használatával oldhatja meg a legegyszerűbben, ha még egy fordított grep -t csövezünk a végére . Például:

grep -A 4 "The mail system" temp.txt | grep -v "The mail system" | grep -v "^\d*$" 

Válasz

Ha nem vagy bezárva A grep használatával próbálkozzon a sed

sed -n "/The mail system/{n;n;p}" 

Amikor talál egy sort, amely tartalmazza a “Levelezési rendszert”, kétszer elolvassa a következő sort a n;n; keresztül, elvetve az előző sorokat.
Ez elhagyja a 3. sort csoportjának a mintaterületen, amelyet azután sed “s p paranccsal kinyomtatunk. A vezető -n opció megakadályozza az összes többi nyomtatást .

A következő két sor kinyomtatásához csak a következő és a nyomtatás n;p esetekre van szükség még kétszer.

sed -n "/The mail system/{n; n;p; n;p; n;p}" 

A szükséges sorok következő sorainak összegyűjtése és egyetlen blokk kinyomtatása csak egy pN beolvassa a következő sort és hozzáfűzi a mintaterülethez,

Itt van a végső sűrített verzió …

sed -n "/The mail system/{n;n;N;N;p}" 

Ha csoportelválasztót szeretne, hasonlóan a grep wouuld kimenetéhez, használhatja a sed “s insert parancsot is i (amelynek a sor utolsó parancsának kell lennie) …

Itt található a szintaxis, amelybe bele kell foglalni egy csoportelválasztót

sed -n "/The mail system/{n;n;N;N;p;i-- }" > output-file # or | ... 

Itt van az első mérkőzés kimenete:

<[email protected]>: host mx1.hotmail.com[65.54.188.94] said: 550 Requested action not taken: mailbox unavailable (in reply to RCPT TO command) -- 

Megjegyzések

  • +1. Köszönöm. Ebben az esetben nincs szükségem rá ', de ' megtartom ezt a könyvjelzőt, ha bonyolultabb dolgokat kapok.
  • Ez nagyszerű válasz!

Válasz

grep -A 2 -B -2 "The mail system" mbox_file 

-B az előző sorokra vonatkozik, ezért nem kell megadni -negatív értéket.

grep -A 2 -B 2 "The mail system" mbox_file # This will work please check 

Megjegyzések

  • Ez nem válaszol a kérdésre. -A 2 -B 2 a kontextus előtti két sorból a kontextus utáni 2 sorba nyomtat. A kérdés a kontextus utáni 2 sorból a kontextus utáni 4 sor nyomtatására vonatkozik.

Válasz

I semmi értelme csak a grep (ek) használatának, kivéve, ha ez “szigorú korlátozás. Nem lehet egy grep hívással végrehajtani.

grep -A 2 "The mail system" mbox_file | tail -n +3 
  • grep: Keresse meg a sort, majd adja ki a 2 sort,
  • farok: vágja le az első 2 sort (azaz kezdje a harmadik sortól).

Megjegyzések

  • Ez csak akkor működik, ha egyetlen egyező sor van, amit valószínűleg nem a kérdés tesz fel.
  • A kérdés nem más, mint az, segít a jelenlegi helyzetemben :-).
  • @ daniel.neumann tudom, de pontosan a cipőjében voltam, és azt hittem, mások ' Google-fu vezet itt is.

Válasz

Ha el akarja távolítani az első 2 sort, vezesse a >

sed "1,2d" 

mint a

 grep -A 2 "The mail system" mbox_file | sed "1,2d"  

Megjegyzések

  • Hiányoztad, hogy a minta sokszor előfordul. Ha a „Levelezési rendszer” jelenik meg a 4., 14., 24., 34.,… soron, az OP meg akarja tekinteni a 6., 16., 26., 36. … sort. 36,….

Válasz

Ez kinyomtatja a következő 1 sort a regexp egyezés után, Perl segítségével p>

perl -ne "print if( (/The mail system/ && ($end=1))..!$end-- )" 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük