Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Printing first and last line

by maheshkumar (Sexton)
on Aug 13, 2012 at 23:09 UTC ( #987239=perlquestion: print w/ replies, xml ) Need Help??
maheshkumar has asked for the wisdom of the Perl Monks concerning the following question:

I just want to print the first and the last IP from the following text file that I have

Traceroute: 10 1291134800 1291134792 1291134792 GoogleDNS 0.media.coll +egehumor.com 92.123.72.112 traceroute to 92.123.72.112 (92.123.72.112), 30 hops max, 60 byte pack +ets 1 * * * 2 134.2.205.30 0.765 ms 1.125 ms 1.428 ms 3 134.2.250.254 0.612 ms 0.701 ms 0.695 ms 4 129.143.135.33 0.515 ms 0.516 ms 0.510 ms 5 129.143.1.149 1.014 ms 1.012 ms 1.010 ms 6 129.143.1.166 1.036 ms 0.821 ms 0.808 ms 7 129.143.1.130 274.286 ms 274.265 ms * 8 80.81.192.28 7.246 ms 6.913 ms 6.896 ms 9 92.123.72.0 7.319 ms 7.311 ms 7.297 ms Traceroute: 12 1291134800 1291134792 1291134792 LocalDNS 0.media.colle +gehumor.com 212.201.100.184 traceroute to 212.201.100.184 (212.201.100.184), 30 hops max, 60 byte +packets 1 * * * 2 134.2.205.30 0.774 ms 1.121 ms 1.426 ms 3 134.2.250.254 0.635 ms 0.716 ms 0.709 ms 4 129.143.135.33 0.584 ms 0.583 ms 0.579 ms 5 129.143.1.149 0.951 ms 0.948 ms 0.942 ms 6 188.1.233.229 1.042 ms 0.969 ms 0.962 ms 7 188.1.145.77 4.665 ms 4.804 ms 4.826 ms 8 188.1.146.50 4.815 ms 4.890 ms 4.841 ms 9 188.1.145.73 7.071 ms 7.202 ms 7.241 ms 10 188.1.145.69 9.976 ms 10.001 ms 9.441 ms 11 212.201.100.184 9.289 ms 9.259 ms 9.276 ms
For example, if I have the above file then it should print the ones in which the first and the last does not match. So from the above i would be expecting something like: Destination to 92.123.72.112 but reached 92.123.72.0 And for the second traceroute it should not print anything as the destination 212.201.100.184 actually reached 212.201.100.184. So far I have written the following code..
#!/usr/bin/perl -w use Regexp::Common qw/net/; open my $in, '<', "Sample_01.txt" or die $!; open FILE, ">", "filename.txt" or die $!; while (my $line = <$in>){ if($line =~ /^Traceroute: .* (\S+)/) { $traceroute = $1; print FILE "Destination to |$traceroute|"; my ($ip) = $line =~ /(?: \d+ \s \s+) ($RE{net}{IPv4}) /msx +; if($traceroute eq $ip){ print FILE "$ip|"; print FILE "\n"; } } else { } }

Any help please....

Comment on Printing first and last line
Select or Download Code
Re: Printing first and last line
by Old_Gray_Bear (Bishop) on Aug 14, 2012 at 00:46 UTC
    $ head -1 Sample_01.txt $ tail -1 Sample_01.txt
    Sometimes the answer is to use the shell commands rather than try to recreate them in Perl. See Low Fat Linux for an example.

    Update: Added link to head/tail documentation.

    ----
    I Go Back to Sleep, Now.

    OGB

Re: Printing first and last line
by hbm (Hermit) on Aug 14, 2012 at 00:51 UTC
    use strict; use warnings; $/='Traceroute:'; while(<DATA>){ print "wanted $1, arrived at $2\n" if /traceroute to ((?:\d+\.){3}\d+).*\D((?:\d+\.){3}\d+)/s && $1 + ne $2; } __DATA__ Traceroute: 10 1291134800 1291134792 1291134792 GoogleDNS 0.media.coll +egehumor.com 92.123.72.112 traceroute to 92.123.72.112 (92.123.72.112), 30 hops max, 60 byte pack +ets 1 * * * 2 134.2.205.30 0.765 ms 1.125 ms 1.428 ms 3 134.2.250.254 0.612 ms 0.701 ms 0.695 ms 4 129.143.135.33 0.515 ms 0.516 ms 0.510 ms 5 129.143.1.149 1.014 ms 1.012 ms 1.010 ms 6 129.143.1.166 1.036 ms 0.821 ms 0.808 ms 7 129.143.1.130 274.286 ms 274.265 ms * 8 80.81.192.28 7.246 ms 6.913 ms 6.896 ms 9 92.123.72.0 7.319 ms 7.311 ms 7.297 ms Traceroute: 12 1291134800 1291134792 1291134792 LocalDNS 0.media.colle +gehumor.com 212.201.100.184 traceroute to 212.201.100.184 (212.201.100.184), 30 hops max, 60 byte +packets 1 * * * 2 134.2.205.30 0.774 ms 1.121 ms 1.426 ms 3 134.2.250.254 0.635 ms 0.716 ms 0.709 ms 4 129.143.135.33 0.584 ms 0.583 ms 0.579 ms 5 129.143.1.149 0.951 ms 0.948 ms 0.942 ms 6 188.1.233.229 1.042 ms 0.969 ms 0.962 ms 7 188.1.145.77 4.665 ms 4.804 ms 4.826 ms 8 188.1.146.50 4.815 ms 4.890 ms 4.841 ms 9 188.1.145.73 7.071 ms 7.202 ms 7.241 ms 10 188.1.145.69 9.976 ms 10.001 ms 9.441 ms 11 212.201.100.184 9.289 ms 9.259 ms 9.276 ms

    Prints:

    wanted 92.123.72.112, arrived at 92.123.72.0

      I have written a code which is as follows

      use strict; use warnings; #!/usr/bin/perl -w use Regexp::Common qw/net/; open my $in, '<', 'Sample_01.txt' or die $!; open FILE, '>', 'filename.txt' or die $!; my %ipToRoute; my $source_IP; while (my $line = <$in>) { if (my ($ip) = $line =~ m/^Traceroute: .* (\S+)/) { $source_IP = $ip; } else { $line =~ s/^ +//; my $destination_IP = (split / +/, $line)[1]; push @{$ipToRoute{$source_IP}}, $destination_IP if $destination_IP + ne '*'; } } foreach my $source_IP (keys %ipToRoute) { my $final_destination = @{$ipToRoute{$source_IP}}[-1]; if ($source_IP ne $final_destination) { print FILE "Destination to $source_IP but reached $final_desti +nation\n"; } }

      But for 221.204.248.107 i am getting 80800

      My data can change as I have large files with some other useless stuff as well. My data is as follows

        Hello maheshkumar, and welcome to the Monastery!

        i am getting 80800

        Yes, you’re getting the wrong answer there, but before that you are also getting 136 warnings of the form:

        Use of uninitialized value $destination_IP in string ne at...

        which should act as a red flag that your logic is wrong somewhere. Never ignore warnings! They are there to help you.

        Now, the problem with your script is that it’s finding lines like this:

        ns1.sina.com.cn. 80800 IN A 202.106.184.166

        which come after the list of IP addresses you are interested in. So, you need some way of turning off the search when the list has ended. Here is one possible algorithm:

        clear in_list flag FOR each line in the data file IF line matches first line of a list THEN extract IP save IP as source set in_list flag ELSE IF in_list flag set THEN SWITCH line CASE line matches second list line ignore it CASE line matches list-address save addresses, indexed to current source CASE default (i.e. no longer in list) clear in_list flag ENDSWITCH ENDIF ENDELSE ENDFOR

        Here is an implementation in Perl:

        #! perl use strict; use warnings; my $line1_re = qr! ^ Traceroute: \s+ .* \s+ (\S+) $ !x; my $line2_re = qr! ^ traceroute !x; my $destn_re = qr! ^ # start of line \s* # optional whitesp +ace \d+ # sequence number: + nnn \s+ # whitespace (?: # EITHER (?: \d{1,3} \. ){3} \d{1,3} # IP address: nn +n.nnn.nnn.nnn | # OR \* \s+ \* \s+ \* # * * * ) !x; my (%ipToRoute, $source_IP, $in_tracing); while (my $line = <DATA>) { chomp $line; if ($line =~ /$line1_re/) { $source_IP = $1; $in_tracing = 1; } elsif ($in_tracing && $line !~ /$line2_re/) { if ($line =~ /$destn_re/) { $line =~ s/ ^ \s+ //x; my $destination_IP = (split /\s+/, $line)[1]; push @{ $ipToRoute{$source_IP} }, $destination_IP unless $destination_IP eq '*'; } else { $in_tracing = 0; } } } foreach (keys %ipToRoute) { my $final_destination = @{ $ipToRoute{$_} }[-1]; printf "Destination to %s but reached %s\n", $_, $final_destination unless $_ eq $final_destination; } __DATA__ Traceroute: 22 1291136399 1291136393 1291136393 LocalDNS home.china.co +m.cn 221.204.248.107 traceroute to 221.204.248.107 (221.204.248.107), 30 hops max, 60 byte +packets 1 134.2.173.254 0.170 ms 0.191 ms 0.185 ms etc.

        With the data you supplied, this outputs:

        Destination to 92.123.72.112 but reached 92.123.72.0 Destination to 78.108.81.20 but reached 217.106.1.146 Destination to 208.78.244.38 but reached 208.78.244.0

        as required. Note: For improved readability, I have extracted the regular expressions using the qr operator, and annotated the third one because of its complexity.

        HTH,

        Athanasius <°(((><contra mundum

Re: Printing first and last line
by pvaldes (Chaplain) on Aug 14, 2012 at 08:27 UTC
    perl -ne 'print if eof || $. == 1' my_file

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://987239]
Approved by GrandFather
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (9)
As of 2014-07-24 11:59 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (160 votes), past polls