http://www.perlmonks.org?node_id=1015066


in reply to grep in line and print

Hello justbow, and welcome to the Monastery!

Perhaps this is what you’re looking for:

#! perl use strict; use warnings; while (my $line = <DATA>) { if ($line =~ /C4:46:19:75:C1:55/) { print "ID = ", (split /\s+/, $line)[0], "\n"; } } __DATA__ SS-ID VLAN MAC TIME IP RSSI MODE UAPSD BW GI WMOS DHCP IDENTITY ----- ---- --- ---- -- ---- ---- ----- -- -- ---- ---- -------- 1-1 0 C4:46:19:75:C1:55 23m 192.168.5.253 -24 bgn no 20 S 4.9 ack* 1-2 0 5C:57:C8:69:8C:1E 3s 192.168.5.254 -38 bg no 20 L 4.8 ack*

Output:

12:28 >perl 495_SoPW.pl ID = 1-1 12:28 >

Update: The following is probably clearer:

#! perl use strict; use warnings; while (my $line = <DATA>) { chomp $line; my @recs = split /\s+/, $line; if ($recs[2] eq 'C4:46:19:75:C1:55') { print "ID = ", $recs[0], "\n"; } } __DATA__ SS-ID VLAN MAC TIME IP RSSI MODE UAPSD BW GI WMOS DHCP IDENTITY ----- ---- --- ---- -- ---- ---- ----- -- -- ---- ---- -------- 1-1 0 C4:46:19:75:C1:55 23m 192.168.5.253 -24 bgn no 20 S 4.9 ack* 1-2 0 5C:57:C8:69:8C:1E 3s 192.168.5.254 -38 bg no 20 L 4.8 ack*

(Same output.)

See split.

Hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Replies are listed 'Best First'.
Re^2: grep in line and print
by justbow (Initiate) on Jan 24, 2013 at 04:41 UTC
    Hello Athanasius, Thanks for the suggestion, But im still getting the error :D I'm trying the code :
    #! perl use strict; use warnings; $allmac = "~/temp/allmac.txt"; print $allmac; while (my $line = $allmac) { if ($line =~ /C4:46:19:75:C1:55/) { $id = (split /\s+/, $line)[0]; print "ID = $id\n"; } }
    And getting error :
    Global symbol "$allmac" requires explicit package name at ./filtermac. +pl line 5. Global symbol "$allmac" requires explicit package name at ./filtermac. +pl line 6. Global symbol "$allmac" requires explicit package name at ./filtermac. +pl line 7. Global symbol "$id" requires explicit package name at ./filtermac.pl l +ine 11. Global symbol "$id" requires explicit package name at ./filtermac.pl l +ine 12. Execution of ./filtermac.pl aborted due to compilation errors.

      With use strict in effect, you need to declare your variable names:

      my $allmac = ... ... my $id = ...

      But the line:

      while (my $line = $allmac)

      won’t work: it’s assigning the file name to $line, but it needs to call readline on a file handle, like so:

      open (my $fh, '<', $allmac) or die "Can't open file '$allmac' for read +ing: $!"; while (my $line = <$fh>) { ....

      Applying the diamond operator to a filehandle: <$fh> is the standard way to call readline in Perl. See readline and I/O Operators; also open and perlopentut.

      Hope that helps,

      Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,