2016-07-25 15 views
1

Ich habe eine Datei (unter extrahieren)lesen Datei in Array, wenn die Variable Null ist nicht Ausgangsleitung

1468929555,4,  0.0000, 999999.0000,  0.0000,0,0,0,0,0 
1468929555,5,  0.4810,  0.0080,  67.0200,0,4204,0,0,0 
1468929555,6,  0.1290,  0.0120,  0.4100,0,16,0,0,0 
1468929555,7,  0.0000, 999999.0000,  0.0000,0,0,0,0,0 

Ich möchte in dieser Datei und geben die Ergebnisse auf eine andere Datei zu lesen, zu ändern Unix Zeit menschlich lesbar - aber ich möchte nur tun, wenn Feld 7 besetzt ist.

#!/bin/bash 
file="monitor_a.log" 
host=`hostname` 
while IFS=, read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 
do 
mod_time=`date -d @$f1 +"%d/%m/%y %H:%M:%S"` 

if [[$f7=="0"]]; 
then 
done <"$file" 
fi 

echo "$mod_time,300 ,$host, Apache-a, $f2 , $f5 , $f4 , $f3 , $f7 , $f8 ,   $f9 ,$f6, $f10" >> mod_monitor_a.log 

done <"$file" 

Das Problem liegt in meiner if-Anweisung, erhalte ich die Fehler

./monitor_convert.sh: line 12: syntax error near unexpected token `done' 
./monitor_convert.sh: line 12: ` done <"$file"' 

Mein Denken in der if-Anweisung ist, dass, wenn Feld7 = 0 die zum Lesen der Datei in einem Array zurück, das done < "$ Datei" -Bit. Das ist offensichtlich falsch, aber ich kann nicht arbeiten, wie man diese Linie verfehlt.

Danke.

+2

Das Einfügen des Skripts in http://www.shellcheck.net/ zeigt das Problem: "Wenn [[$ f7 ==" 0 "]]" falsch ist, benötigen Sie Leerzeichen um die Klammern. – fedorqui

Antwort

1

Es gibt zwei Probleme:

Die if [[$f7=="0"]] Bedürfnisse Räume und die "done" innerhalb dieser wenn sollte sein fortsetzen:

#!/bin/bash 
file="monitor_a.log" 
host=`hostname` 
while IFS=, read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 
do 
    mod_time=`date -d @$f1 +"%d/%m/%y %H:%M:%S"` 

    if [[ $f7 == "0.0000" ]] 
    then 
    continue 
    fi 

    echo "$mod_time,300 ,$host, Apache-a, $f2 , $f5 , $f4 , $f3 , $f7 , $f8 ,   $f9 ,$f6, $f10" >> mod_monitor_a.log 

done <"$file" 
+0

Danke an alle. Ich habe am Ende die if-Anweisung als ungleich gesetzt und schreibe die Datei in die if-Anweisung. ####### Einlesen der Datei in ein durch Komma getrenntes Array während IFS =, lesen -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 do ####### Ändern Sie die Unix-Zeit für den lesbaren Wert mod_time = 'Datum -d @ $ f1 +"% d /% m /% y% H:% M:% S "' ####### Entfernen Sie alle Domains ohne Treffer wenn [[$ f7 ! = "0"]] dann printf '% s \ n' "$ f7" echo "$ mod_time, 300, $ host, Apache-a, $ f2, $ f5, $ f4, $ f3, $ f7 , $ f8, $ f9, $ f6, $ f10 ">> mod_monitor_a.log fi erledigt <" $ datei " – user3615267

2

Bündel Syntax Themen: -

  1. bash if-construct, sollte es if [[ $f7 == "0" ]]; sein und nicht if [[$f7=="0"]];
  2. Zeilennummer 10, done <"$file", die Syntax ist nicht erlaubt. Wenn Sie planen, die Schleife zu unterbrechen/fortzusetzen, verwenden Sie einfach break/continue Konstrukte.
  3. Verwenden Sie die Legacy-Befehlsersetzung nicht unter Verwendung von ``, wohingegen Sie aus Gründen $(..), page übernehmen.

neuformatierte Skript mit zero Fragen/Warnungen von http://www.shellcheck.net/

#!/bin/bash 
file="monitor_a.log" 
host=$(hostname) 
while IFS=, read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 
do 
    mod_time=$(date -d @"$f1" +"%d/%m/%y %H:%M:%S") 

    if [[ $f7 == "0" ]]; 
    then 
    continue # Process the remaining lines 
    fi 

    echo "$mod_time,300 ,$host, Apache-a, $f2 , $f5 , $f4 , $f3 , $f7 , $f8 ,   $f9 ,$f6, $f10" >> mod_monitor_a.log 

done <"$file" 
0

Dies ist der Code, der für mich am Ende arbeitete, brachte das Schreiben auf neue Datei innerhalb der if-Anweisung.

#!/bin/bash 
file="monitor_a.log" 
host=`hostname` 
#######Read in file to array separated by comma 
while IFS=, read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 
do 
#######Modify Unix time to human readable 
mod_time=`date -d @$f1 +"%d/%m/%y %H:%M:%S"` 

#######Remove all Domains without a hit 
if [[ $f7 != "0" ]] 
then 
    printf '%s\n' "$f7" 
    echo "$mod_time,300 ,$host, Apache-a, $f2 , $f5 , $f4 , $f3 , $f7 , $f8 , $f9 ,$f6, $f10" >> /home/saengers/mod_monitor_a.log 
fi 

done <"$file"