Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Perl equivlanet of simple awk

by Anonymous Monk
on Mar 19, 2011 at 21:57 UTC ( #894193=perlquestion: print w/ replies, xml ) Need Help??
Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

For use in a Perl cgi script, what's an equivalent of the following awk command

awk '/user@example.com/ {print $2}' /home/bob/db.txt

Assume db.txt contains 4 columns, with a valid email address in the first column, and a password in the second column. (For this purpose, security isn't an issue.) I just want to retrieve a password associated with an email address.

Comment on Perl equivlanet of simple awk
Download Code
Re: Perl equivlanet of simple awk
by wind (Priest) on Mar 19, 2011 at 22:16 UTC
    It's possible to do something like that very easily with a one-liner. However, more verbose is probably what you're looking for if you intend to include this within a script.
    my $file = '/home/bob/db.txt'; open my $fh, $file or die "$file: $!"; my $pass; while (<$fh>) { chomp; my @fields = split /\s+/; if ($fields[0] eq 'user@example.com') { $pass = $fields[1]; last; } } close $fh;
Re: Perl equivlanet of simple awk
by repellent (Priest) on Mar 19, 2011 at 22:19 UTC
    This equivalent on the command line:
    perl -alne 'print $F[1] if /user\@example.com/' /home/bob/db.txt

    See Command Switches.

    Expanded code:
    use warnings; use strict; open my $FH, '<', '/home/bob/db.txt' or die $!; while (local $_ = <$FH>) { chomp; print((split ' ')[1], "\n") if /user\@example.com/; }

    Update: Added expanded code.
Re: Perl equivlanet of simple awk (a2p)
by LanX (Canon) on Mar 20, 2011 at 02:17 UTC
    for such conversions you can use a2p

    > echo '/user@example.com/ {print $2}' |a2p #!/usr/bin/perl eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' if $running_under_some_shell; # this emulates #! processing on NIH machines. # (remove #! line above if indigestible) eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift; # process any FOO=bar switches $, = ' '; # set output field separator $\ = "\n"; # set output record separator while (<>) { ($Fld1,$Fld2) = split(' ', $_, -1); if (/user@example.com/) { print $Fld2; } }

    anyway you're not checking the first column but the whole line for an email address.

    consider prepending an ^ in your regex.

    Cheers Rolf

    UPDATE: IMHO the @ in the regex should be escaped to avoid array interpolation, seems to be a bug in a2p.

Re: Perl equivlanet of simple awk
by urbansumo (Initiate) on Apr 15, 2015 at 11:52 UTC

    Youve just revolutionsied my whole life!! How did I never know about A2p! Thats amazing!

    Thank you so much!

    The Urban Sumo

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (12)
As of 2015-07-07 12:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (88 votes), past polls