use strict; use warnings; use feature 'state'; my $syslog_names = \"Jun 13 02:32:27 satellife in.identd[25994]: connect from mail.missouri.edu\n"; close STDIN; open STDIN, '<', $syslog_names or die "$!"; while (<>) { state $systemname = 'in.identd'; state $regex = qr/^ ( ([a-zA-Z]+\s+[0-9]+ \s+ [0-9]+[:][0-9]+[:][0-9]+) \s+ ([0-9a-zA-Z-]+) \s ([^:[]+) (\[.*?\])? \s* [:] \s* (?: ([^:]*)[:])? \s* (.*) ) $ /x; if (m/$regex/) { my @m = ($1, $2, $3, $4, $5, $6, $7); print "$m[3]\n$_\n" if $m[3] eq "$systemname"; } }