ввод цикла while для вывода `command` - PullRequest
17 голосов
/ 06 июня 2010
#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" )

Слишком мало результатов в Google (не понимаю, что я хочу найти :(). Я бы хотел, чтобы он был совместим с Bourne (/ bin / sh), но он не имеет быть.

Ответы [ 4 ]

20 голосов
/ 06 июня 2010

Это sh -совместимо:

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

Однако sh не имеет массивов, поэтому ваш код не может быть таким, как в sh. Другие правы, говоря, что и bash, и perl в настоящее время довольно широко распространены, и вы в основном можете рассчитывать на их доступность в не древних системах.

ОБНОВЛЕНИЕ для отражения комментария @ Денниса

15 голосов
/ 06 июня 2010

Это работает в Bash:

while read line; do  
  ARRAY[$c]="$line"
  c=$((c+1))  
done < <(tcpdump -n -r "$pcap")
1 голос
/ 06 июня 2010
for line in $(tcpdump -n -r $pcap)  
do  
 command  
done 

Это не совсем то, что мне нужно.Но это близко.И Shell совместимы.Я создаю таблицы HTML из вывода tcpdump.Цикл for создает новую строку

для каждого слова.Он должен создать новую строку для каждой строки (\ n окончание). Paste bin script01.sh .
1 голос
/ 06 июня 2010

Если вас не волнует, что такое bourne, вы можете перейти на 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++] = $_;
}

Или в оболочке, используйте for:

for line in $(tcpdump -n -r $pcap)  
do  
 command  
done  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...