2011-05-17 2 views
5

Ho codice bash breveutilizzando il comando bash in perl

cat example.txt | grep mail | awk -F, '{print $1}' | awk -F= '{print $2}' 

voglio usarlo in script perl, e mettere la sua uscita ad una linea di matrice per riga. Ho provato questo, ma non ha funzionato

@array = system('cat /path/example.txt | grep mail | awk -F, {print $1} | awk -F= {print $2}'); 

Grazie per l'aiuto ...

+0

[Questa domanda] (http://stackoverflow.com/questions/797127/whats-the-differences-between-system-and-backticks-and-pipes-in-perl) fornisce alcuni esempi di come chiamare programmi esterni in Perl. –

risposta

8

Prova:

@array = `cat /path/example.txt | grep mail | awk -F, {print \$1} | awk -F= {print \$2}')`; 

Notando che backticks vengono utilizzati e che i segni del dollaro hanno bisogno di essere sfuggito come l'operatore QX interpolerà di default (cioè penseranno che $ 1 siano variabili Perl piuttosto che argomenti di awk).

+0

thats it :) grazie mille – ibrahim

+1

È più sicuro usare open(); Risparmia qualche fuga. –

+4

non parlare di "awk" in perl è una tale bestemmia. –

11

Il valore di ritorno della system() è lo stato di ritorno del comando eseguito. Se si desidera che l'uscita, utilizzare apici inversi:

@array = `cat /path/example.txt | grep mail | awk -F, {print \$1} | awk -F= {print \$2}`; 

quando valutato in un contesto di lista (ad esempio quando il valore di ritorno viene assegnato a un array), si otterrà le linee di uscita (o una lista vuota se non c'è produzione).

+1

È un arrrrrrrray pirata! – Konerak

+0

sentiti libero di correggere su 'array', una risposta corretta vale più di una divertente. Rimuoverò i commenti stupidi;) – Konerak

+0

L'ho fatto ma questa volta awk non funziona, dà solo l'output di 'cat /path/example.txt | posta grep ', cosa dovrei fare? – ibrahim

2

Non posso fare a meno di creare una versione perl pura ... dovrebbe funzionare allo stesso modo, se ricordo bene il mio awk molto scarso.

use strict; 
use warnings; 

open A, '<', '/path/example.txt' or die $!; 
my @array = map { (split(/=/,(split(/,/,$_))[0]))[1] . "\n" } (grep /mail/, <A>);