2016-04-10 8 views
2

Ich bin sehr neu zu awk, und versuche, es zu verwenden, um eine Protokolldatei zu analysieren. Die Datei enthält Informationen zur Flash-Version, falls installiert. Die Linie ich suche ist wie:Verwenden von awk, um übereinstimmenden Inhalt zu finden

Fri Apr 8 11:38:39 EDT 2016: Current Flash version: noflash 

Also ich ein Drehbuch geschrieben suchen:

#!/bin/bash 

NOFLASH=`awk -F ' ' '($2 == "Apr") && ($3 == "8") && ($10 == "noflash") { print $10 }' /Library/Logs/FlashUpdateScript.log` 

if [ "$NOFLASH" = *noflash* ];then 
echo "Flash not installed on Apr 8" 
else echo "Flash was installed on Apr 8" 
fi 

Das Problem ist, dass es mehrere Zeilen sein, die April enthalten 8 und noflash, so in In diesen Fällen gibt es nicht den Wert "Flash nicht installiert" zurück, nach dem ich suche. Wie bearbeite ich dieses Skript, damit ich feststellen kann, ob am 8. April Flash installiert wurde?

+0

Bitte nehmen Sie sich einen Blick auf [Editieren-Hilfe] (http://stackoverflow.com/editing-help). – Cyrus

+1

Ihr Problem liegt im Shell-Skript, nicht im 'awk'. Wahrscheinlich willst du 'if [[" $ NOFLASH "== * noflash *]]', um eine Übereinstimmung zu erhalten. So wie es aussieht, wenn Sie nicht eine Datei haben, die 'noflash' im Namen enthält, suchen Sie buchstäblich nach' * noflash * ', nicht mit globbing. Sie sollten in der Lage sein, Ihr Bash-Skript (https://stackoverflow.com/questions/951336/how-to-debug-a-bash-script/951352#951352) mit 'bash -x' zu debuggen und zu sehen, was ist geht weiter. Mir ist nicht klar, was du willst, wenn es keinen Flash gibt, dann wurde Flash installiert, dann deinstalliert usw. –

+1

wäre es nicht besser grep zu benutzen, um den Job zu machen? –

Antwort

1

Mit grep können Sie passen, was Sie wollen:

logfile="/Library/Logs/FlashUpdateScript.log" 
grep "Fri Apr 8 .*Current Flash version: noflash" ${logfile} 

Sie diese in einem Skript verwenden können, so etwas wie

if [ -n "$(grep "Fri Apr 8 .*Current Flash version: noflash" ${logfile})" ]; then 
    echo "Flash not installed on Apr 8" 
else 
    echo "Flash was installed on Apr 8" 
fi 
+0

Vielen Dank! Grep funktioniert perfekt! – tep

0

Wenn alles, was Sie tun möchten, die Nachricht ist drucken, dann würde ich tun, nur das Ganze in awk:

awk '($2 == "Apr") && ($3 == "8") && ($10 == "noflash") { f = 1 } 
END { print "Flash", (f ? "not" : "was"), "installed on Apr 8" }' /Library/Logs/FlashUpdateScript.log` 

Ich entfernte das benutzerdefinierte Feld Separator als Standard für Ihren Fall gut funktioniert. Eine Variable f wird basierend auf denselben Bedingungen festgelegt, die Sie verwendet haben. Sobald die Datei verarbeitet wurde, wird die Nachricht gedruckt, wobei das Wort "nicht" oder "war" eingefügt wird, abhängig davon, ob f wahr ist.

Verwandte Themen