in reply to Re: Need help with a nested IF statement
in thread Need help with a nested IF statement

the ifconfig -a prints the following. The device name and ip are NOT on the same line. I don't know how to say look for x on line 1 and tell me y on line 2 after the second regex find..... Can I do that in Perl?

output of command

cccadm@redsox::perl: ifconfig -a lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu +8232 index 1 inet 127.0.0.1 netmask ff000000 fjgi0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 ind +ex 2 inet 10.254.190.232 netmask ffffff00 broadcast 10.254.190.255 fjgi1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 ind +ex 3 inet 10.254.140.221 netmask ffffff00 broadcast 10.254.140.255

Replies are listed 'Best First'.
Re^3: Need help with a nested IF statement
by ikegami (Patriarch) on Nov 02, 2009 at 17:38 UTC

    The device name and ip are NOT on the same line.

    Since you process each line one at a time, that's a problem.

    The easiest solution is to look at entire records.

    use strict; use warnings; my $opsys = $^O; print "Hello, your operating system is: $opsys\n"; if ($opsys =~ /linux/) { my $nics = qx|/sbin/ifconfig| or die("Can't get info from ifconfig: $!\n"); my @nics = split /(?<=\n)(?=\w)/, $nics; for (@nics){ my ($device) = /^eth(\d)/ or next; my ($ip) = /\bnet addr:([\d.]+)/ or next; print "Device $device has the IP Address of $ip\n"; } } else { my $nics = qx|ifconfig -a| or die("Can't get info from ifconfig: $!\n"); my @nics = split /(?<=\n)(?=\w)/, $nics; for (@nics){ my ($device) = /^fjgi(\d)/ or next; my ($ip) = /\binet ([\d.]+)/ or next; print "Device $device has the IP Address of $ip\n"; } }

    There's some redundancy here, but I can't figure how to eliminate cleanly.

      That worked very well. Can you tell me what \b is looking for when you write "/\bnet"? What is considered a Word boundry? Also your split line, what is it doing logic-wise. I am pretty new to Perl and Regex still confuses me slightly. Thanks.

        Can you tell me what \b is looking for when you write "/\bnet"?

        To prevent it from matching "foonet"

        What is considered a Word boundry?

        Between a \W and a \w,
        between a \w and a \W,
        between the start of string and a \w, and
        between a \w and the end of string.

        As a regex pattern:

        /(?<=\w)(?!\w)|(?<!\w)(?=\w)/

        Also your split line, what is it doing logic-wise.

        It splits between a \n and a \w.

      I am building on this script to capture more information and be able to spit out the information captured. Eventually this script will be used to change the ip address on a machine. So I built on the earlier version to see if I could capture Netmask and Broadcast address. I know there is something with my regex parameters because I am getting no output again. In the Else loop I think I am searching for inet, one or many data, space, netmask, data, space, broadcast, one or many data. But I am getting nothing. Having tagged each item I am looking for I wonder if I am not properly calling my tags in the print line.

      Can someone take a look please?

      use strict; use warnings; my $opsys = $^O; print "Hello, your operating system is: $opsys" . "\n"; if ($opsys =~ /linux/) { my $nics = qx |/sbin/ifconfig| or die("Can't get info from ifconfig: $!\n"); my @nics = split /(?<=\n)(?=\w)/, $nics; for (@nics){ my ($interface) = /^eth(\d)/ or next; my ($ip) = /\binet addr:([\d.]+)/ or next; print "Interface $interface has the IP Address of $ip\n"; } } else { my $nics = qx |ifconfig -a| or die("Can't get info from ifconfig: $!\n"); my @nics = split /(?<=\n)(?=\w)/, $nics; for (@nics){ my ($interface) = /^fjgi(\d)/ or next; my (@ip) = /\binet ([\d.]+)\snetmask ([\d]+)\sbroadcast ([\d.] ++)/ or next; print "Interface $interface has the IP Address of $ip[0]\n \tN +etmask: $ip[1]\n \tBroadcast $ip[2]\n"; } }

      Here is another variation I have tried that is finding nothing

      my ($ip, $mask, $bcast) = /\binet ([\d.]+)\snetmask ([\d]+)\sb +roadcast ([\d.]+)/ or next; print "Interface $interface has the IP Address of $ip\n \tNetm +ask: $mask\n \tBroadcast $bcast\n";

      How do I print $_ to see what I am actually finding? I tried this and was getting a not declared error

        'f' is not a digit.

        By the way, \d works fine outside of character classes ([]).