[Shell Scripting] awk / grep meerdere regels

Pagina: 1
Acties:

  • MadHost
  • Registratie: Januari 2001
  • Laatst online: 12:21
Ik probeer uit een (backup)logfile bepaalde sessies te halen die ik in een variabele heb staan maar het lukt me niet om aan de hand van 1 regel de opvolgende regels te filteren.

Ik heb een lijstje met SessionID's in een variabele $SESSIONS zitten en aan de hand daarvan wil ik de sessie met de daarbijhorende sessieinfo eruithalen en in een andere file gooien.

Met grep kan ik de line met SessionID eruit halen maar ik weet niet hoe ik de rest eruit kan halen. Ik heb internet wel iets gevonden over awk maar daar ben ik niet zo in thuis. Wie kan me helpen?

Voorbeeld: backup.log
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SessionID : 2006/05/13-3
        Backup Specification: Test1
        Session type        : Backup (full)
        Started             : Sat May 13 05:00:00 2006
        Finished            : Sat May 13 05:10:04 2006
        Status              : Completed
        Number of errors    : 0

SessionID : 2006/05/14-1
        Backup Specification: Test2
        Session type        : Backup (full)
        Started             : Sun May 14 02:00:01 2006
        Finished            : Sun May 14 04:00:02 2006
        Status              : Completed
        Number of errors    : 0

SessionID : 2006/05/14-2
        Backup Specification: Test3
        Session type        : Backup (full)
        Started             : Sun May 14 04:00:01 2006
        Finished            : Sun May 14 06:00:02 2006
        Status              : Failed
        Number of errors    : 1


In de variabele $SESSIONS staat het volgende:
code:
1
2006/05/14-1 2006/05/14-2


In het outputbestand (sessions.info) wil ik de volgende output hebben:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SessionID : 2006/05/14-1
        Backup Specification: Test2
        Session type        : Backup (full)
        Started             : Sun May 14 02:00:01 2006
        Finished            : Sun May 14 04:00:02 2006
        Status              : Completed
        Number of errors    : 0

SessionID : 2006/05/14-2
        Backup Specification: Test3
        Session type        : Backup (full)
        Started             : Sun May 14 04:00:01 2006
        Finished            : Sun May 14 06:00:02 2006
        Status              : Failed
        Number of errors    : 1

[ Voor 48% gewijzigd door MadHost op 16-05-2006 20:32 ]

System specs | X


Verwijderd

Ik snap niet helemaal wat je nu precies wilt.

Je kan toch de regel met het sessie-id pakken mbv:
code:
1
grep -i "sessionid" bestand

?

[ Voor 11% gewijzigd door Verwijderd op 16-05-2006 16:58 ]


  • MadHost
  • Registratie: Januari 2001
  • Laatst online: 12:21
Ik kan idd wel de row met SessionID eruit halen maar het gaat erom dat ik ook automatisch de volgende 6 regels met additionele info mee krijg. Ik wil namelijk het bestand filteren op sessions (+info) die ik in mijn variabele (array) $SESSIONS heb staan.

De openingspost is gewijzigd met een uitbreiding van het voorbeeld.

[ Voor 13% gewijzigd door MadHost op 16-05-2006 20:33 ]

System specs | X


  • Sjonny
  • Registratie: Maart 2001
  • Laatst online: 06-02 22:36

Sjonny

Fratser

man grep
-A NUM, --after-context=NUM
Print NUM lines of trailing context after matching lines. Places a line containing -- between contiguous groups of matches.
dus iets van
code:
1
grep -A 6 sessions.info | grep -v '--'

The problem is in the part of your brain that handles intelligence.


  • MadHost
  • Registratie: Januari 2001
  • Laatst online: 12:21
Bedankt!

Het lijkt er op dat dit is wat ik nodig heb maar volgens mij zit de -A optie niet in de grep die ik gebruik op m'n hp-ux machine :? Schijnt iets te maken te hebben met versieverschillen in de software. (GNU ... ??) Ik ga het morgenochtend ff testen.

Ondertussen heb ik ook nog een awk oplossing gevonden die ik morgen ga testen:
code:
1
# cat backup.log | awk '/./,/\n\n/' |awk '/SessionID/'


Met sed schijnt het ook te kunnen
code:
1
more backup.log | sed -n -e '/SessionID/{x;1!p;g;$!N;p;D;}' -e h

Als iemand op voorhand als ziet dat het niet gaat werken hoor ik het graag!

[ Voor 15% gewijzigd door MadHost op 16-05-2006 22:02 . Reden: sed toegevoegd ]

System specs | X


  • sampoo
  • Registratie: Juni 2000
  • Niet online
uitvoer van grep --help bekijken en kijken of de -A functionaliteit anders benoemd wordt?

  • DeMoN
  • Registratie: Maart 2001
  • Laatst online: 06-01 23:13

DeMoN

Pastafari

Het kan veel makkelijker aangezien elk deel in die backup.log eindigd op hetzelfde ("Number of errors").
Daarom kan je alles daartussen gewoon laten weergeven :)

code:
1
cat backup.log | awk '/2006\/05\/14-1/, /Number/'

(je moet alleen die "/" wel uitescapen met "\" zoals je ziet ;) )

zo heb ik het getest:
[sub]
[b]cell@debianbox:~$ cat backup.log[/b]
SessionID : 2006/05/13-3
        Backup Specification: Test1
        Session type        : Backup (full)
        Started             : Sat May 13 05:00:00 2006
        Finished            : Sat May 13 05:10:04 2006
        Status              : Completed
        Number of errors    : 0

SessionID : 2006/05/14-1
        Backup Specification: Test2
        Session type        : Backup (full)
        Started             : Sun May 14 02:00:01 2006
        Finished            : Sun May 14 04:00:02 2006
        Status              : Completed
        Number of errors    : 0

SessionID : 2006/05/14-2
        Backup Specification: Test3
        Session type        : Backup (full)
        Started             : Sun May 14 04:00:01 2006
        Finished            : Sun May 14 06:00:02 2006
        Status              : Failed
        Number of errors    : 1
cell@debianbox:~$

[b]cell@debianbox:~$ cat backup.log | awk '/2006\/05\/14-1/, /Number/'[/b]
SessionID : 2006/05/14-1
        Backup Specification: Test2
        Session type        : Backup (full)
        Started             : Sun May 14 02:00:01 2006
        Finished            : Sun May 14 04:00:02 2006
        Status              : Completed
        Number of errors    : 0
cell@debianbox:~$
[/sub]

[ Voor 4% gewijzigd door DeMoN op 17-05-2006 00:26 ]

Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein


  • MadHost
  • Registratie: Januari 2001
  • Laatst online: 12:21
Bedankt DeMoN!

Dit is idd wat ik zoek! De volgende stap is om het sessionid uit een shell variabele te halen. Ik probeer het met de volgende commando maar ik blijf klooien met de variabele uit de shell te gebruiken. Op een of andere manier doe ik iets fout met het parsen :S
code:
1
2
session='14-1 14-2'
cat backup.log | awk '/ENVIRON["session"]/, /error/' | grep -v warning

[ Voor 15% gewijzigd door MadHost op 17-05-2006 09:42 ]

System specs | X


  • MadHost
  • Registratie: Januari 2001
  • Laatst online: 12:21
Het is opgelost!!! :) (let op de quotes bij de variabele session)
code:
1
cat backup.log | awk '/'"$session"'/, /error/' | grep -v warning


Nogmaals iedereen bedankt!

System specs | X

Pagina: 1