#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),但它不会拥有 to be。
答案 0 :(得分:20)
这是sh
- 兼容:
tcpdump -n -r "$pcap" | while read line; do
# something
done
但是,sh
没有数组,因此您无法使用sh
中的代码。其他人都说正确的bash
和perl
现在相当普遍,你可以指望他们可以在非古代系统上使用。
更新以反映@Dennis的评论
答案 1 :(得分:15)
这适用于bash:
while read line; do
ARRAY[$c]="$line"
c=$((c+1))
done < <(tcpdump -n -r "$pcap")
答案 2 :(得分:1)
如果您不关心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++] = $_;
}
或者在shell中,使用for
:
for line in $(tcpdump -n -r $pcap)
do
command
done
答案 3 :(得分:1)
for line in $(tcpdump -n -r $pcap)
do
command
done
这并不完全符合我的需要。但它很接近。和Shell兼容。我正在从tcpdump输出创建HTML表。 for
循环生成一个新的&lt; tr&gt;每个单词的行。它应为每个行(\ n结尾)创建一个新行。
Paste bin script01.sh