Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[CLI] veldnaam=waarde paar uit string halen

Pagina: 1
Acties:

  • Zeezicht
  • Registratie: Juni 2001
  • Laatst online: 01-11 12:35
Ik heb een logfile waarin veldnaam=waarde paren in staan. Helaas staan die niet altijd op dezelfde plek in de string, dus ik kan niet met awk het 3e en 4e deel bijvoorbeeld printen.
Nu wil ik dus met sed of awk (ben er nog niet uit welke het mogelijk maakt) zorgen dat ik waarde1 en waarde2 dus uit de string haal en die achter elkaar print met een komma ertussen.

Voorbeeld string:
Sep 27 06:30:32 hostname daemon: NOTICE: text, user=e-mail, ip=[::fff
f:44.44.44.44], headers=0, body=1769135, rcvd=5097, sent=1836802, time=2724

Nu kunnen de headers, body, rcvd en sent items dus op andere plekken soms staan.

Heeft iemand een idee hoe dit op te lossen?
Iets in deze trant doet het niet goed:
awk '/rcvd=([0-9]+), sent=([0-9]+)/ {print $1, $3}'

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Weet je al wat je wilt hebben, bijv ip=? Misschien zou je de match dan daar dan op kan aanpassen.

Skill is when luck becomes a habit.


  • Zeezicht
  • Registratie: Juni 2001
  • Laatst online: 01-11 12:35
ik wil de rcvd en sent waardes hebben, en dan bijv. altijd eerst rcvd en dan sent met een komma gescheiden. Dus zo bijv:
32243,1326

En ik kan dus wel matchen op de regels, maar het gaat erom dat er verschillende soorten staan, die ook anders opgebouwd zijn. Sommige zonder rcvd en sent en soms op andere plekken.

  • Zeezicht
  • Registratie: Juni 2001
  • Laatst online: 01-11 12:35
Niemand die een idee heeft?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Ben niet zo thuis in RegExp gedoe maar het moet toch wel mogelijk zijn om te matchen op 'rcvd=' en 'sent='

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Als je die regels in test.txt hebt staan dan levert:
$> cat test.txt | cut -c 48- | awk -F '=' '{print $6":"$7'} | sed -e 's/, [a-z]*//g'

het volgende op
5097:1836802

Nu met Land Rover Series 3 en Defender 90


  • Zeezicht
  • Registratie: Juni 2001
  • Laatst online: 01-11 12:35
MTWZZ schreef op maandag 01 oktober 2007 @ 10:12:
Als je die regels in test.txt hebt staan dan levert:
$> cat test.txt | cut -c 48- | awk -F '=' '{print $6":"$7'} | sed -e 's/, [a-z]*//g'

het volgende op
5097:1836802
Die gaat bijna helemaal goed. Maar de volgende regel matched die niet helemaal goed:
code:
1
Oct  1 10:23:11 weblx100 imapd: TIMEOUT, user=naam@domein.tld, ip=[::ffff:111.111.111.111], headers=0, body=178056, rcvd=4015, sent=219497, time=3707

Daar pakt ie namelijk sent en time ipv rcvd en sent. Komt dat door die cut?

  • Zeezicht
  • Registratie: Juni 2001
  • Laatst online: 01-11 12:35
Zonder die cut werkt het wel. Alleen werkt die met de 6e en 7e match. En niet met een match op sent=[0-9]+ en rcvd=[0-9]+. Dus als er iets verandert in de logs, dan werkt dit niet meer, of erger nog, dan geeft ie de verkeerde waarden terug.

Bij regex kan je vaak met haakjes, delen uit een regex benaderen. En dus (rcvd=[0-9]+) is dan bijv. deel 1 van de array die je terug krijgt. Kan dat hier niet?

Daarnaast moet ik namelijk ook het e-mail adres hebben, en die staat dus niet op dezelfde plek... $2 printen geeft meestal het correcte behalve in die laatste regel, want dan kan krijg ik het IP.

[ Voor 19% gewijzigd door Zeezicht op 01-10-2007 12:30 ]


  • netvor
  • Registratie: September 2000
  • Laatst online: 08-04-2024
cat test.txt


code:
1
2
3
Sep 27 06:30:32 hostname daemon: NOTICE: text, user=e-mail, ip=[::ffff:44.44.44.44], headers=0, body=1769135, rcvd=5097, sent=1836802, time=2724
Oct  1 10:23:11 weblx100 imapd: TIMEOUT, user=naam@domein.tld, ip=[::ffff:111.111.111.111], headers=0, body=178056, rcvd=4015, sent=219497
Oct  1 10:23:11 weblx100 imapd: TIMEOUT, user=naam@domein.tld, ip=[::ffff:111.111.111.111], headers=0, body=178056, sent=45678, rcvd=401


sed -re 's/^.*sent=([0-9]+).+rcvd=([0-9]+).*$|^.*rcvd=([0-9]+).+sent=([0-9]+).*$/\1\4,\2\3/' test.txt


code:
1
2
3
1836802,5097
219497,4015
45678,401


Dit werkt ongeacht de volgorde van sent en rcvd. :*)

[ Voor 1% gewijzigd door netvor op 01-10-2007 12:57 . Reden: bugfix :) ]

Computer Science: describing our world with boxes and arrows.


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Zeezicht schreef op maandag 01 oktober 2007 @ 12:21:
[...]

Die gaat bijna helemaal goed. Maar de volgende regel matched die niet helemaal goed:
code:
1
Oct  1 10:23:11 weblx100 imapd: TIMEOUT, user=naam@domein.tld, ip=[::ffff:111.111.111.111], headers=0, body=178056, rcvd=4015, sent=219497, time=3707

Daar pakt ie namelijk sent en time ipv rcvd en sent. Komt dat door die cut?
Was 5 sec werk ongeveer :Y) en nogal quick-n-dirty

Nu met Land Rover Series 3 en Defender 90


  • Zeezicht
  • Registratie: Juni 2001
  • Laatst online: 01-11 12:35
netvor schreef op maandag 01 oktober 2007 @ 12:50:
cat test.txt


code:
1
2
3
Sep 27 06:30:32 hostname daemon: NOTICE: text, user=e-mail, ip=[::ffff:44.44.44.44], headers=0, body=1769135, rcvd=5097, sent=1836802, time=2724
Oct  1 10:23:11 weblx100 imapd: TIMEOUT, user=naam@domein.tld, ip=[::ffff:111.111.111.111], headers=0, body=178056, rcvd=4015, sent=219497
Oct  1 10:23:11 weblx100 imapd: TIMEOUT, user=naam@domein.tld, ip=[::ffff:111.111.111.111], headers=0, body=178056, sent=45678, rcvd=401


sed -re 's/^.*sent=([0-9]+).+rcvd=([0-9]+).*$|^.*rcvd=([0-9]+).+sent=([0-9]+).*$/\1\4,\2\3/' test.txt


code:
1
2
3
1836802,5097
219497,4015
45678,401


Dit werkt ongeacht de volgorde van sent en rcvd. :*)
Ik probeer dat ding een beetje te ontleden, omdat ik ook het user= gedeelte eruit moet halen. Maar het gedeelte met \1\4,\2\3 snap ik niet helemaal. Daar worden de waarden geprint, maar waarom 2 stuks (\1 en \4)? Want in \1 zit niks en \2 bij de tweede ook niet. Ik krijg het dan ook nog niet voor elkaar om die user= er ook uit te krijgen.

  • netvor
  • Registratie: September 2000
  • Laatst online: 08-04-2024
"If it was difficult to write, it should be difficult to understand." >:)

Maargoed, ik zal hem proberen uit te leggen. Het zijn eigenlijk twee regexpen naast elkaar met een | (logische OR, disjunctie) ertussen. De linker regexp zoekt in de string naar [iets]sent=nummertje[iets]rcvd=nummertje[iets] en slaat die nummertjes op in \1 en \2.

Het rechter deel zoekt naar [iets]rcvd=nummertje[iets]sent=nummertje[iets] en slaat die nummertjes op in \3 en \4.

Wat uiteindelijk geprint wordt is \1\4,\2\3 oftewel: links van de komma staat \1 (sent uit de linker regexp) en \4 (sent uit de rechter regexp) en rechts van de komma staat \2 (rcvd uit de linker) en \3 (rcvd uit de rechter).

Het hele gedoe met de OR is dus om ervoor te zorgen dat de volgorde waarin sent en rcvd voorkomen niet uitmaakt. Maarja, als je dus nog een derde veld hebt dan zou je dus 3!=6 verschillende regexpen moeten hebben...niet echt goed.

Een ander idee wat ik nu ineens heb is om de line meerdere keren door sed heen te pipen (no pun intended). Eerst zoek je naar je sent=nummertje en plak je het nummertje met daarachter een zelfgekozen fieldseperator vooraan de string. Tweede keer zoek je naar rcvd=nummertje en doe je hetzelfde. De laatste keer gooi je alles na die zelfgekozen fieldseperator weg. En dan ben je hopelijk klaar.

EDIT: deze dus:
sed -re 's/^(.*user=([^,]+).*)$/\2====\1/' -e 's/^(.*rcvd=([^,]+).*)$/\2,\1/' -e 's/^(.*sent=([^,]+).*)$/\2,\1/' -e 's/^(.+)====.*$/\1/' test.txt


Output:
code:
1
2
3
1836802,5097,e-mail
219497,4015,naam@domein.tld
45678,401,naam@domein.tld


Eigenlijk best simpel. Dat ik daar niet eerder aan heb gedacht.

[ Voor 11% gewijzigd door netvor op 01-10-2007 14:13 ]

Computer Science: describing our world with boxes and arrows.


  • Zeezicht
  • Registratie: Juni 2001
  • Laatst online: 01-11 12:35
Bedankt voor het meedenken, ik ga 'm morgen ochtend meteen testen... nu eerst het bed maar eens in rollen!

Works like a charm! Dank je hiervoor...

[ Voor 16% gewijzigd door Zeezicht op 02-10-2007 11:26 ]

Pagina: 1