2016-04-05 9 views
2

Ich habe Array-Werte wie folgt und unten in der Schleife verwendet.Bash-Skript brauchen Array-Werte in For-Schleife

a=(400 402 403 404) 

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

Ausgang

400 
402 
403 
404 

Ich brauche Array eins nach dem anderen zu nehmen Werte als auch unten.

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

ich brauche die Fehler httpderror.log zählen in finden, so dass ich Fehler bin vorbei http Codes nacheinander Datei- und Druck Anzahl der Fehler in jedem HTTP-Code gefunden zu überprüfen. HTTP-Fehler gefunden in 8. Spalte ($ 8 == $ i).

Ausgabe sollte Fehleranzahl von angepassten Linien wie 400 sein - 44 402 -43, sondern müssen nur Werte wie unten ..

44 
43 
42 

Bitte helfen Sie mir, wie dies zu tun ....

+1

Danke Jungs, es funktionierte – Sasee

Antwort

5

Sie können dies tun:

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

Jedoch habe ich es direkt in awk tun schlagen und vermeiden Aufruf awk Befehl für jedes Element in Array.

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

Das Mischen von Datenstrukturen zwischen zwei separaten Skriptsprachen ist , die nach Ärger fragen.

Basierend auf der ursprünglichen Frage, Sie für 400.402.403 genaue Treffer mögen, und 404 in Spalte 8.

reguläre Ausdrücke verwenden, können Sie dies allein in tun.

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

Eine kürzere Version wäre:

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

(aber awk kann genausogut das Zählen tun).

+0

vielleicht '... {a [$ 8] ++} END {for (k in a) ...' – karakfa

+0

@karafka Ja, genau wie Anubhavas Lösung. Ich habe diesen Teil verpasst, aber so würde ich das machen. –

1

Versuchen Sie folgendes:

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

Danke Munir, es ist so einfach und half, was ich erwartet hatte ..... – Sasee