2016-04-05 35 views
2

dizi değerlerine ihtiyacım var aşağıdaki gibi dizi değerleri var ve aşağıda döngü için kullanılır.Bash komut dosyasının döngü için

a=(400 402 403 404) 

for i in "${a[@]}" 
do 
echo $i; 
done 

çıkış

Ben dizi tek tek değerler alır ve aşağıdaki gibi kullanmak gerekir
400 
402 
403 
404 

.

for i in "${a[@]}" 
do 
awk '{if($8==$i) print} filename.log | wc -l; 
done 

i her http kodunda bulunan dosyayı ve hata baskı sayısını kontrol etmek için tek tek http hata kodları geçirerek böylece hatalar httpderror.log saymak bulmak gerekir. Http hatası 8. sütunda bulundu (8 $ = $ i).

çıkış 400 gibi eşleşti çizgilerin hata sayısı olmalıdır - ....

44 
43 
42 

bunun nasıl yapılacağını bana yardım edin .. 402 -43 44 ama aşağıda sadece değere gerek

+1

teşekkürler çocuklar, bu – Sasee

cevap

5

Bunu yapabilirsin:

for i in "${a[@]}" 
do 
    awk -v code="$i" '$8==code{c++} END{print code, "-", c}' filename.log 
done 

Awk doğrudan bunu yapıyor öneririz ve önlemek dizide her eleman için awk komutunu çağırarak Ancak.

awk 'BEGIN { 
    a[400]=a[402]=a[403]=a[404]=0 
} 
$8 in a { 
    a[$8]++ 
} 
END { 
    for (i in a) 
     print i, "-", a[i] 
}' filename.log 
1

İki ayrı kodlama dili arasında veri yapılarını karıştırmak, sorun çıkarmak için 'dur. asıl soruya dayanarak

, normal ifadeler kullanarak sütuna 8.

içinde 400,402,403 ve 404 için kesin sonuç istiyorum, yalnız yapabilirsiniz.

awk '$8 ~ /^40[0234]$/ {n++} END {print n}' filename.log 

Daha kısa versiyonu olacaktır:

awk '$8 ~ /^40[0234]$/' filename.log | wc -l 

(ama awk gibi iyi sayım yapabilirsiniz).

+0

belki '... (a içinde k) için {bir [$ 8] ++} END {...' – karakfa

+0

@karafka çalıştı Evet, tıpkı anubhava'nın çözümü gibi. O bölümü özledim ama böyle yaparım. –

1

bu deneyin:

for i in "${a[@]}" 
do 
    awk '{print $8}' filename.log | grep $i | wc -l 
done 
+0

Teşekkürler Munir, o kadar basit ve beklediğimden yardım ettim ..... – Sasee