Как преобразовать этот скрипт в независимый от платформы Perl-скрипт? - PullRequest
2 голосов
/ 25 августа 2010

У меня есть сценарий cshell, который выглядит примерно так:

`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.Я думаю, что переносимость не может быть гарантирована без поведения netstat и grep, поэтому я постараюсь убедиться, что они поддерживаются в целевых системах.

Я ищу

  • Какие общие соображения следует помнить, чтобы сделать сценарий Perl переносимым?
  • Как можно воспроизвести поведение awk в Perl?
  • Могу ли я повторить поведение grep в Perl?Это целесообразно (я сделаю это, только если у Perl grep есть какие-либо преимущества)?

[Я нацеливаюсь на все распространенные версии Windows и Linux здесь]

Ответы [ 4 ]

1 голос
/ 25 августа 2010

Для Windows есть netstat, но -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 голосов
/ 08 февраля 2011

Для репликации поведения скрипта awk в perl существует команда a2p, которая должна поставляться с большинством дистрибутивов perl.

Perl поддерживает поиск по шаблону из коробки и, несомненно, более мощный, чем grep

0 голосов
/ 25 августа 2010

Кажется, самая непереносимая вещь - это вызов 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:передайте "myprocess" как переменную в скрипт awk:

netstat -ap | awk -v proc="myprocess" '/tcp/ && $0 ~ proc {split($4, a, /:/); print a[2]}'
0 голосов
/ 25 августа 2010

Как правило, perl может делать все, что могут делать awk или grep, и, если важна кроссплатформенная работа, может помочь хранение всей вашей логики в одной программе (не полагаясь на оболочку).

Что-то подобное может работать для вас:

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

Не проверено, но оно должно быть близко.Этот однострочник ожидает ввода netstat в stdin.

Вы также можете делать все в 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" }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...