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 p
… N
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-- )"