for 루프를 병렬화하여 파일 구문 분석

for 루프를 병렬화하여 파일 구문 분석

pcap일부 추적 파일을 구문 분석하는 다음 스크립트가 있습니다 . 여러 개의 폴더가 있으며 각 폴더에는 pcap구문 분석해야 하는 4개의 파일이 포함되어 있습니다.

for d in * ; 
do cd ${d}; 
for file in firewall router2 vclient vserver ; 
do tshark -r ${file}_log.pcap -T fields -e ip.src -e ip.dst -e tcp.srcport -e tcp.dstport -e tcp.len -e ip.len -e ip.hdr_len -e tcp.hdr_len -e _ws.col.Time -t e | awk '{print $1,$2,$3,$4,$6-$7-$8,$9}' > ${file}_conv_t.txt; 
cat ${file}_conv_t.txt | awk '$4==5001{print $6,$5}' | sed 's/\([0-9]*\)\.[0-9]*/\1/' | awk '{sum[$1]+=$2} END {for (i in sum) {print i,sum[i]} }' | sort | cut -d ' ' -f 2 > ${file}_in.csv; 
cat ${file}_conv_t.txt | awk '$3==5001{print $6,$5}' | sed 's/\([0-9]*\)\.[0-9]*/\1/' | awk '{sum[$1]+=$2} END {for (i in sum) {print i,sum[i]} }' | sort | cut -d ' ' -f 2 > ${file}_out.csv ; 
done ; 
cd .. ; 
done

모든 파일은 독립적으로 파싱이 가능하기 때문에 최대한 병렬화를 하고 싶습니다. 다음과 같이 각 파일이 병렬로 처리되도록 첫 번째 파일 뒤에 &대신 배치를 시도했습니다.;done

for d in * ; 
do cd ${d}; 
for file in firewall router2 vclient vserver ; 
do tshark -r ${file}_log.pcap -T fields -e ip.src -e ip.dst -e tcp.srcport -e tcp.dstport -e tcp.len -e ip.len -e ip.hdr_len -e tcp.hdr_len -e _ws.col.Time -t e | awk '{print $1,$2,$3,$4,$6-$7-$8,$9}' > ${file}_conv_t.txt; 
cat ${file}_conv_t.txt | awk '$4==5001{print $6,$5}' | sed 's/\([0-9]*\)\.[0-9]*/\1/' | awk '{sum[$1]+=$2} END {for (i in sum) {print i,sum[i]} }' | sort | cut -d ' ' -f 2 > ${file}_in.csv; 
cat ${file}_conv_t.txt | awk '$3==5001{print $6,$5}' | sed 's/\([0-9]*\)\.[0-9]*/\1/' | awk '{sum[$1]+=$2} END {for (i in sum) {print i,sum[i]} }' | sort | cut -d ' ' -f 2 > ${file}_out.csv ; 
done &
cd .. ; 
done

그러나 이것은 전혀 작동하지 않으며 여전히 순차적입니다.

내가 무엇을 놓치고 있나요?

답변1

{}중괄호 사용 :

for d in * ; 
do cd ${d}; 
for file in firewall router2 vclient vserver ; 
do { tshark -r ${file}_log.pcap -T fields -e ip.src -e ip.dst -e tcp.srcport -e tcp.dstport -e tcp.len -e ip.len -e ip.hdr_len -e tcp.hdr_len -e _ws.col.Time -t e | awk '{print $1,$2,$3,$4,$6-$7-$8,$9}' > ${file}_conv_t.txt; 
cat ${file}_conv_t.txt | awk '$4==5001{print $6,$5}' | sed 's/\([0-9]*\)\.[0-9]*/\1/' | awk '{sum[$1]+=$2} END {for (i in sum) {print i,sum[i]} }' | sort | cut -d ' ' -f 2 > ${file}_in.csv; 
cat ${file}_conv_t.txt | awk '$3==5001{print $6,$5}' | sed 's/\([0-9]*\)\.[0-9]*/\1/' | awk '{sum[$1]+=$2} END {for (i in sum) {print i,sum[i]} }' | sort | cut -d ' ' -f 2 > ${file}_out.csv ; } &
done
cd .. ; 
done

관련 정보