input of while loop to come from output of `command`

后端 未结 4 1699
心在旅途
心在旅途 2021-02-04 02:16
#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=$(         


        
相关标签:
4条回答
  • 2021-02-04 02:45

    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

    0 讨论(0)
  • 2021-02-04 02:47

    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  
    
    0 讨论(0)
  • 2021-02-04 03:10
    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.

    0 讨论(0)
  • 2021-02-04 03:11

    This works in bash:

    while read line; do  
      ARRAY[$c]="$line"
      c=$((c+1))  
    done < <(tcpdump -n -r "$pcap")
    
    0 讨论(0)
提交回复
热议问题