2010-06-06 1 views
12
#I used to have this, but I don't want to write to the disk 
# 
pcap="somefile.pcap" 
tcpdump -n -r $pcap > all.txt 
while read line; do 
    ARRAY[$c]="$line" 
    c=$((c+1)) 
done < all.txt 

Quanto segue non funziona.input del ciclo while proveniente dall'output di `command`

# I would prefer something like... 
# 
pcap="somefile.pcap" 
while read line; do 
    ARRAY[$c]="$line" 
    c=$((c+1)) 
done < $(tcpdump -n -r "$pcap") 

Troppo pochi risultati su Google (non capisce quello che voglio trovare :(). Mi piacerebbe tenerlo Bourne-compatibile (/ bin/sh), ma non è così hanno . di essere

risposta

1
for line in $(tcpdump -n -r $pcap) 
do 
command 
done 

questo non è esattamente facendo quello che mi serve. Ma è vicino. E compatibile con Shell. Sto creando tabelle HTML dall'output di tcpdump. Il ciclo for crea una nuova riga tr > per ogni parola. Dovrebbe creare una nuova riga per ogni riga (\ n finale). Paste bin script01.sh.

+2

Avrai bisogno di 'saveIFS = $ IFS; IFS = $ '\ n'; your-per-loop; IFS = $ saveIFS' dato che 'IFS' fa in modo che le cose vengano rotte su spazi, tabulazioni e nuove righe per impostazione predefinita. –

+0

Ci proverò oggi e riferirò. –

1

Se non si cura di essere Bourne, è possibile passare a Perl:

my $pcap="somefile.pcap"; 
my $counter = 0; 
open(TCPDUMP,"tcpdump -n -r $pcap|") || die "Can not open pipe: $!\n"; 
while (<TCPDUMP>) { 
    # At this point, $_ points to next line of output 
    chomp; # Eat newline at the end 
    $array[$counter++] = $_; 
} 

O in guscio, utilizzare for:

for line in $(tcpdump -n -r $pcap) 
do 
command 
done 
+3

Nella versione della shell, è necessario impostare IFS ad un solo un ritorno a capo in modo che l'uscita del 'tcpdump' non è rotto ad ogni spazio. –

13

questo funziona in bash:

while read line; do 
    ARRAY[$c]="$line" 
    c=$((c+1)) 
done < <(tcpdump -n -r "$pcap") 
+0

Sì. Funziona in Bash. Qualche ragione per cui non verrà eseguita in/bin/sh? Mi piacerebbe * rendere la sceneggiatura portatile. La portabilità è di solito importante? Per garantire che altri possano anche eseguire lo script ... –

+4

La sintassi di sostituzione del processo '<(...)' non è disponibile per sh. Gli array –

+1

non sono disponibili anche per sh. Ma +1 per la sostituzione del processo. –

14

Questo è sh compatibile:

tcpdump -n -r "$pcap" | while read line; do 
    # something 
done 

Tuttavia, sh non avere le matrici, quindi non è possibile avere il codice come è in sh. Altri hanno ragione nel dire che sia bash che perl al giorno d'oggi sono piuttosto diffusi, e si può contare soprattutto sul fatto che siano disponibili su sistemi non antichi.

UPDATE per riflettere @ commento di Dennis

+0

Ho avuto grandi speranze per questo, ma non genera i file HTML! Non riesco a capire perché. >> http://stackoverflow.pastebin.com/TecWxMwW –

+0

eek, ho lasciato un "eco" all'interno, che ho usato per i test. Risolto ora, dovrebbe essere equivalente al tuo. (A proposito, suppongo tu abbia inteso che il tuo codice non genera HTML quando inserisci questo snippet - questo snippet da solo non genera HTML più del tuo snippet) – Amadan

+2

Tranne che la shell Bourne non ha matrici. E, in Bash, le due linee nel corpo del tuo loop (OK, il ciclo dell'OP) possono essere compresse in: 'ARRAY [$ c] + = (" $ line ")' o 'ARRAY [C++] =" $ line "'. Ma +1 per la pipe in 'while'. –