如何将此shell脚本转换为独立于平台的Perl脚本?

如何将此shell脚本转换为独立于平台的Perl脚本?,perl,shell,awk,grep,portability,Perl,Shell,Awk,Grep,Portability,我有一个cshell脚本,它是这样的: `netstat -ap | & grep tcp | grep myprocess | awk '{print $4}' | awk 'BEGIN { FS = :"}{print $2}'` 这就是它的工作原理 一, 二, 三, 我需要使用Perl使其尽可能可移植。我认为如果没有netstat和grep的行为,就无法保证可移植性,因此我将努力确保目标系统支持它们 我在找 要使Perl脚本具有可移植性,需要记住哪些一般注意事项? 如何在Per

我有一个cshell脚本,它是这样的:

`netstat -ap | & grep tcp | grep myprocess | awk '{print $4}' | awk 'BEGIN { FS = :"}{print $2}'`
这就是它的工作原理

一,

二,

三,

我需要使用Perl使其尽可能可移植。我认为如果没有
netstat
grep
的行为,就无法保证可移植性,因此我将努力确保目标系统支持它们

我在找

  • 要使Perl脚本具有可移植性,需要记住哪些一般注意事项?
  • 如何在Perl中复制
    awk
    行为?
  • 我还可以在Perl中复制
    grep
    的行为吗?这是否明智(只有在Perl的grep有任何优势的情况下,我才会这么做)

[我的目标是所有流行的Windows和Linux版本]

一般来说,
perl
可以做
awk
grep
可以做的任何事情,如果跨平台操作很重要,将所有逻辑保存在一个程序中会有所帮助(不依赖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" }
}
#/usr/bin/env perl
使用警告;
严格使用;
打开我的$netstat、'-|'、'netstat-ap';
而(){
下一步除非/tcp/和/myprocess/;
我的@fields=split/\s+/;
如果($fields[3]=~/(\d+/){print“$1\n”}
}
有一个,但它的
-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";
}
#/usr/bin/perl
使用警告;
严格使用;
除非@ARGV==1,否则为“用法:$0程序\n”;
#例如。。。1234/myprocess
my$prog=qrx;#/修复如此突出显示
没有“exec”警告;
打开我的$netstat、“-|”、“netstat”、“-ap”
或死亡“$0:无法启动netstat:$!”;
而(){
我的@f=分裂;
下一步,除非$f[0]eq“tcp”&&$f[-1]=~/$prog/;
(my$local=$f[3])=~s/^.*://;
打印$local,“\n”;
}

对于作为TCP连接并与命令行上命名的程序关联的
netstat
输出的每一行,获取本地地址(第4列),通过字符串中的最后一个冒号删除所有应该离开端口的内容并打印结果。

看起来最不可移植的事情是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]}'

要在perl中复制awk脚本行为,大多数perl发行版都应该附带一个命令
a2p


perl支持开箱即用的模式匹配,它无疑比grep

@gbacon更强大:perl=
实用提取报告语言
?=>这是一个backronym,原始名称不代表任何东西,该语言的正确名称是
perl
,解释器的名称是
perl
awk'{print$4}'|awk'BEGIN{FS=“:”{print$2}'
可以替换为一个awk语句
awk'{split($4,:,a);打印一个[2]}'
当然,但是awk可以做一些perl做不到的事情。@ghostdog。就连我也是:)@ghostdog74 awk真是太神奇了:)
netstat -ap | perl -lane '
    next unless /tcp/ and /myprocess/;  # this is the "grep" part
    print((split /:/, $F[3])[-1]); # this is the "awk" part
'
netstat -ap | awk '/tcp/ && /myprocess/ {split($4, a, /:/); print a[2]}'
netstat -ap | awk -v proc="myprocess" '/tcp/ && $0 ~ proc {split($4, a, /:/); print a[2]}'