use strict; use warnings; my @required = qw( name timestamp dl_retransmits_pct dl_throughput mac ); my $req_regx = join( '|', @required ); while (my $line = ) { my %matched = map{ $_ => undef } $line =~ /($req_regx)/g; print $line if scalar( keys %matched ) == scalar( @required ); } __DATA__ mac timestamp name dl_retransmits_pct dl_throughput is a hit mac timestamp name dl_retransmits_pct throughout is a miss name timestamp dl_retransmits_pct dl_throughput is a miss foo mac name dl_throughput name timestamp name dl_retransmits_pct mac mac is a hit name timestamp dl_retransmits_pct is a miss dl_throughput is a miss