input of while loop to come from output of `command`
#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
The following fails to work.
开发者_C百科# I would prefer something like...
#
pcap="somefile.pcap"
while read line; do
ARRAY[$c]="$line"
c=$((c+1))
done < $( tcpdump -n -r "$pcap" )
Too few results on Google (doesn't understand what I want to find :( ). I'd like to keep it Bourne-compatible (/bin/sh), but it doesn't have to be.
This is sh
-compatible:
tcpdump -n -r "$pcap" | while read line; do
# something
done
However, sh
does not have arrays, so you can't have your code like it is in sh
. Others are correct in saying both bash
and perl
are nowadays rather widespread, and you can mostly count on their being available on non-ancient systems.
UPDATE to reflect @Dennis's comment
This works in bash:
while read line; do
ARRAY[$c]="$line"
c=$((c+1))
done < <(tcpdump -n -r "$pcap")
If you don't care about being bourne, you can switch to 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++] = $_;
}
Or in shell, use for
:
for line in $(tcpdump -n -r $pcap)
do
command
done
for line in $(tcpdump -n -r $pcap)
do
command
done
This isn't exactly doing what I need. But it is close. And Shell compatible. I'm creating HTML tables from the tcpdump output. The for
loop makes a new <tr> row for each word. It should make a new row for each line (\n ending).
Paste bin script01.sh.
精彩评论