web-dev-qa-db-ja.com

「コマンド」の出力から来るwhileループの入力

#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での結果が少なすぎる(何を検索したいのか分からない:()。ボーン互換(/ bin/sh)を保持したいが、haveまであります。

20
Felipe Alvarez
for line in $(tcpdump -n -r $pcap)  
do  
 command  
done 

これは私が必要としていることを正確に行っているわけではありません。しかし、それは近いです。シェル互換。 tcpdumpの出力からHTMLテーブルを作成しています。 forループは、Wordごとに新しい<tr>行を作成します。 lineごとに新しい行を作成する必要があります(\ n終了)。 Paste bin script01.sh

1
Felipe Alvarez

これはsh互換です:

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

ただし、shには配列がないため、shのようにコードを含めることはできません。他の人はbashPerlの両方が今日広く普及していると言って間違いはなく、ほとんどが古代ではないシステムで利用できると期待できます。

[〜#〜] update [〜#〜] @Dennisのコメントを反映

21
Amadan

これはbashで動作します:

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

ボーンであることに関心がない場合は、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  
1
DVK