2010-08-24 8 views
2

J'ai un script cShell qui est quelque chose comme ceci:Comment convertir ce script shell en un script Perl indépendant de la plateforme?

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

Voilà comment cela fonctionne

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 

Je dois rendre ceci aussi portable que possible en utilisant Perl. Je pense que la portabilité ne peut pas être garantie sans le comportement de netstat et grep, donc je vais essayer de m'assurer qu'ils sont pris en charge sur les systèmes cibles.

Je cherche

  • Les considérations d'ordre général de garder à l'esprit pour faire portable le script Perl?
  • Comment répliquer le comportement awk dans Perl?
  • Puis-je également répliquer le comportement de grep en Perl? Est-ce conseillé (je le ferai seulement si le grep de Perl a des avantages)?

[Je cible toutes les versions Windows et Linux répandues ici]

+0

@gbacon: Is not PERL = 'Rapport d'extraction pratique Language'? – Lazer

+3

=> qui est un backronyme, le nom original ne correspond à rien, le nom propre de la langue est 'Perl', le nom de l'interpréteur est' perl' –

+0

'awk '{print $ 4}' | awk 'BEGIN {FS = ":"} {print $ 2}' 'peut être remplacé par une seule instruction awk 'awk' {split ($ 4,:, a); imprime une [2]} '' – Vijay

Répondre

0

En général, perl peut faire tout ce qui awk ou grep peut faire, et si l'opération multi-plateforme est importante, en gardant tous vos logique dans un programme peut aider (pas de dépendance sur le shell).

Quelque chose comme cela pourrait fonctionner pour vous:

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

Untested, mais il devrait être proche. Ce one-liner attend l'entrée netstat sur stdin.

Vous pouvez également faire tout en Perl comme suit:

#!/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

sure, mais awk peut faire certaines choses Perl ne peux pas (ou pas plus facile) – ghostdog74

+0

@ ghostdog..Il semble que vous aimez awk plus de Perl :). Même que je fais :) – Vijay

+0

@ ghostdog74 awk est incroyable :) –

1

Il y a un netstat for Windows, mais son -p ne fait pas ce que vous voulez.

Quant au reste de la fonctionnalité, vous pouvez utiliser

#! /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"; 
} 

Pour chaque ligne de netstat sortie qui est une connexion TCP et associé au programme nommé sur la ligne de commande, saisissez l'adresse locale (colonne 4), supprimez tout à travers le dernier deux-points de la chaîne, qui devrait quitter le port, et imprimez le résultat.

0

Semble la chose la plus non-portable est l'appel netstat, mais:

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

ou, le bâton avec awk, qui peut facilement faire ce que grep fait:

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

Pour passer « myprocess "comme variable dans le script awk:

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

Pour répliquer le comportement de script awk en perl, il y a une commande a2p qui devrait venir avec la plupart des distributions Perl.

perl prend en charge la correspondance de modèles de la boîte, et son sans doute plus puissant que grep