2010-06-06 14 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 

के आउटपुट से आने वाले लूप का इनपुट निम्नलिखित काम करने में विफल रहता है। गूगल पर'कमांड'

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

बहुत कम परिणाम (समझ में यह नहीं है कि मैं क्या लगता है :(चाहते हैं)। मैं इसे बॉर्न-संगत (/ bin/श) रखना चाहते हैं, लेकिन यह नहीं है । होने की

उत्तर

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

यह ठीक नहीं कर रहा है कि मैं क्या जरूरत है। लेकिन यह करीब है। और शैल संगत। मैं tcpdump आउटपुट से HTML टेबल बना रहा हूँ। for लूप प्रत्येक शब्द के लिए एक नया <tr> पंक्ति बनाता है। इसे प्रत्येक लाइन (\ n समापन) के लिए एक नई पंक्ति बनाना चाहिए। Paste bin script01.sh

+2

आपको 'saveIFS = $ IFS करना होगा; आईएफएस = $ '\ n'; अपने गैर-पाश; आईएफएस = $ saveIFS' के बाद से 'आईएफएस' चीजों को डिफ़ॉल्ट रूप से रिक्त स्थान, टैब और न्यूलाइन पर टूटा जा सकता है। –

+0

मैं आज इसे आजमाउंगा और रिपोर्ट करूंगा। –

1

आप सीमा होने के बारे में परवाह नहीं है, तो आप पर्ल करने के लिए स्विच कर सकते हैं:

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++] = $_; 
} 

या खोल में, for का उपयोग करें:

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

खोल संस्करण में, आप इतना है कि 'tcpdump' के उत्पादन में प्रत्येक स्थान पर टूटी नहीं है एक ही एक नई पंक्ति के लिए भारतीय विदेश सेवा सेट करना होगा। –

13

यह बैश में काम करता है:

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

हां। यह बैश में काम करता है। किसी भी कारण से यह/bin/sh में नहीं चलेगा? मैं * स्क्रिप्ट पोर्टेबल बनाना चाहता हूँ। पोर्टेबिलिटी आमतौर पर महत्वपूर्ण है? यह सुनिश्चित करने के लिए कि अन्य स्क्रिप्ट भी चला सकें ... –

+4

'<(...) 'प्रक्रिया प्रतिस्थापन वाक्यविन्यास sh के लिए उपलब्ध नहीं है। –

+1

तीर भी श के लिए उपलब्ध नहीं हैं। लेकिन प्रक्रिया प्रतिस्थापन के लिए +1। –

14

यह sh संगत है:

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

हालांकि, sh सरणियों नहीं है, तो आप अपने कोड की तरह यह sh में है नहीं हो सकता। अन्य bash और perl दोनों कहने में सही हैं आजकल व्यापक रूप से व्यापक हैं, और आप ज्यादातर गैर-प्राचीन प्रणालियों पर उपलब्ध होने पर भरोसा कर सकते हैं।

अद्यतन प्रतिबिंबित करने के लिए @ डेनिस की टिप्पणी

+0

मुझे इस के लिए उच्च उम्मीद थी, लेकिन यह HTML फ़ाइलों को उत्पन्न नहीं करता है! मैं समझ नहीं पा रहा हूं क्यों। >> http://stackoverflow.pastebin.com/TecWxMwW –

+0

ईक, मैंने अंदर "इको" छोड़ा, जिसे मैंने परीक्षण के लिए उपयोग किया था। अब फिक्स्ड, आपके बराबर होना चाहिए। (बीटीडब्लू, मुझे लगता है कि आपका मतलब है कि जब आप इस स्निपेट को सम्मिलित करते हैं तो आपका कोड एचटीएमएल उत्पन्न नहीं करता है - यह स्निपेट आपके स्निपेट से कहीं अधिक HTML उत्पन्न नहीं करता है) – Amadan

+2

सिवाय इसके कि बोर्न शैल में एरे नहीं हैं। और, बैश में आपके लूप के शरीर में दो पंक्तियां (ठीक है, ओपी लूप) को ध्वस्त किया जा सकता है: 'ARRAY [$ c] + = ("$ line") 'या' ARRAY [C++] =" $ line "'। लेकिन पाइप के लिए 'जबकि' में +1। –