Splitting on /:\s*/ will save you some work. Actually, let's split on /:\s+/ to avoid needlessly splitting up the date.
We have two ways of looking at item 3 (formerly item 5): 1) It's either a space seperated list, and brackets need to be removed from the second (split approach), or 2) it's a string from which two substrings should be extractded (regexp approach). Since I'd use a regexp to remove the brackets, I might as well use a regexp for the whole thing.
I also added two sanity checks, in case the line doesn't appear as we think.
while (<DATA>) { chomp; my @parts = split /:\s+/, $_; next if $#parts < 3; my @parts_of_3 = $parts[3] =~ /^(\d+) <(.*)>$/; next unless @parts_of_3; my @result = ($parts[1], @parts_of_3); print(join(', ', @result), "\n"); } __DATA__ Jul 6 14:36:41 moe postfix/smtp[15107]: A73DC113B63: to=<oetiker@conc +entric.com>, relay=adamant.concentric.com[207.155.248.168], delay=17, + status=bounced (host adamant.concentric.com[207.155.248.168] said: 5 +54 <oetiker@concentric.com>: Recipient address rejected: Unknown or i +nvalid user oetiker@concentric.com (in reply to RCPT TO command))
In reply to Re: Parsing log files (still)
by ikegami
in thread Parsing log files (still)
by cajun
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |