如何在Perl脚本中使用Awk?

时间:2010-04-19 03:43:27

标签: perl awk

我在使用Perl脚本中的以下代码时遇到问题,我们非常感谢任何建议,如何更正语法?

# If I execute in bash, it's working just fine

bash$ whois google.com | egrep "\w+([._-]\w)*@\w+([._-]\w)*\.\w{2,4}" |awk ' {for (i=1;i<=NF;i++) {if ( $i ~ /[[:alpha:]]@[[:alpha:]]/ )  { print $i}}}'|head -n1

contact-admin@google.com

#-----------------------------------

#but this doesn't work 

bash$ ./email.pl google.com
awk:  {for (i=1;i<=NF;i++) {if (  ~ /[[:alpha:]]@[[:alpha:]]/ )  { print }}}
awk:                              ^ syntax error

# Here is my script
bash$ cat email.pl 
####\#!/usr/bin/perl         


$input = lc shift @ARGV;

$host = $input;

my $email = `whois $host | egrep "\w+([._-]\w)*@\w+([._-]\w)*\.\w{2,4}" |awk ' {for (i=1;i<=NF;i++) {if ( $i ~ /[[:alpha:]]@[[:alpha:]]/ )  { print $i}}}'|head -1`;
print my $email;

bash$

3 个答案:

答案 0 :(得分:4)

如果要在Perl中编码,请使用Net::Whois等模块。搜索CPAN以获取更多此类处理网络的模块。如果你只想使用没有模块的Perl,你可以试试这个(注意你不必再使用egrep / awk了,因为Perl有自己的grepping和字符串操作工具)

   open(WHOIS, "whois google.com |")    || die "can't fork whois: $!";
   while (<WHOIS>) {

       print "--> $_\n";  # do something to with regex to get your email address
   }            
   close(WHOISE)                      || die "can't close whois: $!";

答案 1 :(得分:1)

在Perl中使用awk最简单(但不是最顺畅)的方法是a2p

echo 'your awk script' | a2p

答案 2 :(得分:0)

正如其他人所提到的,反引号是插值的,因此它会在$上跳闸。你可以将它们全部转义,或者你可以使用单引号:

open my $pipe, "-|", q[whois google.com | egrep ... |head -n1];
my $result = join "", <$pipe>;
close $pipe;

这利用了open打开管道的能力。 -|表示文件句柄$pipe应附加到命令的输出。这里的主要优点是你可以选择你的引用类型,q[]相当于单引号而不是内插,所以你不必逃避。

但是天哪,将一个awk脚本粘贴到Perl中有点愚蠢和脆弱。要么使用像Net :: Whois这样的模块,要么在Perl中进行whois抓取,可能会利用Email :: Find这样的东西,或者只是将它写成bash脚本。你的Perl脚本在Perl中的表现并不多。