2010-08-24 106 views
2

我有一个cshell脚本是这样的:如何将此shell脚本转换为独立于平台的Perl脚本?

`netstat -ap | & grep tcp | grep myprocess | awk '{print $4}' | awk 'BEGIN { FS = :"}{print $2}'` 

这是它如何工作的

1.

$ netstat -ap | & grep tcp | grep myprocess 
tcp 0 0 *:1234  *:*  LISTEN  8888/myprocess 

2.

$ netstat -ap | & grep tcp | grep myprocess | awk '{print $4}' 
*:1234 

3.

$ netstat -ap | & grep tcp | grep myprocess | awk '{print $4}' | awk 'BEGIN { FS = ":"}{print $2}'` 
1234 

我需要使用Perl尽可能便携。如果没有netstatgrep的行为,我认为可移植性不能保证,所以我会尽量确保它们在目标系统上受支持。

我找

  • 任何一般考虑要牢记,使Perl脚本便携式?
  • 如何在Perl中复制awk行为?
  • 我还可以在Perl中复制grep的行为吗?这是可取的(我会做,只有当Perl的grep有任何优势)?

[我定位的是这里所有流行的Windows和Linux版本]

+0

@gbacon无疑更加强大:是不是PERL ='实际提取报告Language'? – Lazer 2010-08-24 20:47:34

+3

=>这是一个缩写,原来的名字不代表任何东西,这个语言的正确名称是'Perl',解释器的名字是'perl' – 2010-08-24 21:02:25

+0

'awk'{print $ 4}'| awk'BEGIN {FS =“:”} {print $ 2}''可以用单个awk语句替换'awk'{split($ 4,:,a); print a [2]}'' – Vijay 2010-08-25 06:31:24

回答

0

一般来说,perl可以做任何事情,awkgrep可以做,如果跨平台的操作是很重要的,保持你的所有一个程序中的逻辑可以帮助(不依赖于shell)。

像这样的事情可能会为你工作:

perl -ne 'if (/tcp/ and /myprocess/) { (split /\s+/)[3] =~ /(\d+)/; print $1 }' 

未经检验的,但它应该是接近。这一行代码预计stdin上的netstat输入。

你也可以做的一切在Perl如下:

#!/usr/bin/env perl 
use warnings; 
use strict; 

open my $netstat, '-|', 'netstat -ap'; 

while (<$netstat>) { 

    next unless /tcp/ and /myprocess/; 

    my @fields = split /\s+/; 

    if ($fields[3] =~ /(\d+)/) { print "$1\n" } 
} 
+0

当然,但awk可以做一些事情Perl不能'(或不容易) – ghostdog74 2010-08-25 00:27:16

+0

@ ghostdog ..它似乎你喜欢比perl更多的awk :)。即使我做:) – Vijay 2010-08-25 06:27:37

+0

@ ghostdog74 awk很棒:) – 2011-02-08 05:57:05

1

有一个netstat for Windows,但其-p你想要什么没有做。

至于其他的功能,你可以使用

#! /usr/bin/perl 

use warnings; 
use strict; 

die "Usage: $0 program\n" unless @ARGV == 1; 

# e.g., ... 1234/myprocess 
my $prog = qr</\Q$ARGV[0]\E $ >x; #/fix SO highlighting 

no warnings 'exec'; 
open my $netstat, "-|", "netstat", "-ap" 
    or die "$0: cannot start netstat: $!"; 

while (<$netstat>) { 
    my @f = split; 
    next unless $f[0] eq "tcp" && $f[-1] =~ /$prog/; 

    (my $local = $f[3]) =~ s/^.*://; 
    print $local, "\n"; 
} 

对于netstat输出的每一行,这是一个TCP连接,并与指定的命令行程序相关联,抓住本地地址(第4列),通过字符串中的最后一个冒号删除所有内容(应保留该端口)并打印结果。

0

似乎是最不可移植的东西是netstat的电话,但:

netstat -ap | perl -lane ' 
    next unless /tcp/ and /myprocess/; # this is the "grep" part 
    print((split /:/, $F[3])[-1]); # this is the "awk" part 
' 

,或者坚持使用awk,它可以很容易做到做什么的grep:

netstat -ap | awk '/tcp/ && /myprocess/ {split($4, a, /:/); print a[2]}' 

要通过“myprocess “作为awk脚本中的变量:

netstat -ap | awk -v proc="myprocess" '/tcp/ && $0 ~ proc {split($4, a, /:/); print a[2]}' 
0

要在perl中复制awk脚本行为,有一个命令a2p,应该与最流行的分布。

支持perl的模式匹配的开箱,它比grep的