Bash -while Probleme

Ageoffall

Cadet 4th Year
Registriert
Apr. 2011
Beiträge
79
Hallo,

ich hoffe ich kann euch mein Problem genau schildern.

Ich habe eine Log Datei in der, der Unix Timestamp in eckigen Klammern steht.
Bsp.: [1350328380].
Ich möchte das er die Zeile mit der Zeit und dem Text umwandelt, sodass die normale Zeit da steht.

Code:
cat test.log | grep CRITICAL | tr "[" " " |tr "]" " " >test.log2

while read line; do
da= $line | cut -d" " -f1
datum = date --utc --date "1970-01-01 $da sec" "+%Y-%m-%d %T"
echo $datum;
#echo $line;
done <test.log2
So sieht mein Code aus
Wenn ich das so ausführe sagt er mir "datum: command not found"
Könnt ihr mir helfen?
Ich bin absoluter Neuling auf dem Gebiet und weiß nicht wen ich sonst fragen könnte

Danke euch schonmal
 
ohne auf den rest einzugehen: es darf keine leerzeichen beim = haben, also:

datum=$(date --utc ...)

und in backticks oder $() musst du's auch noch fassen, sonst erhaelst du gar nichts.

Das gleiche gilt übrigens beim darüberstehenden da= $line...
 
Zuletzt bearbeitet:
Ok, ich kanns mir doch nicht verkneifen: Das cat/grep/tr/cut/... Konstrukt ist mehr als nur Overkill. Das ganze kannst du viel einfacher mit awk oder sed erledigen.

Und was soll das date bewirken? Wenn du das Datum von einem Unix Timestamp wissen willst:

date --date @1350328380
 
es ist nicht nur ein timestamp sondern mehrere hundert. Daher will ich es automatisiert haben. Hinter dem Timestamp steht noch ein Text und ich will das zusammen lassen damit ich es nicht einzeln sortieren muss.
 
Und was willst du mir damit sagen? Dass du es lieber nicht mit bash sondern perl/python/ruby/... machen solltest? ;)
 
Mir wurde gesagt das perl noch komplexer wäre. Wie gesagt ich bin absoluter Neuling auf diesem Gebiet und ich habe eingentlich keinen Dunst weder von Perl noch von der Bash. Ich habs halt versucht so gut es ging, mehr krieg ich nicht hin. Daher bitte ich ja um Hilfe^^
 
Code:
[1349698543]File=Log File[ResponseResult] ResultCode=0;[Application]Name=RICOH R5U8xx;Media Driver ver.3.64.02;Version=3.64.02;Company=RICOH;Lang=0007
 
Quick hack, ohne nach CRITICAL zu suchen (was auch mit awk machbar ist, oder du kannst es einfach durch grep jagen)

Code:
gawk 'match($0, /^\[([0-9]+)\](.*)/, a) { print strftime("%c", a[1]), a[2] }' log.txt

Geht vermutlich auch wesentlich schöner, aber ich bin kein awk kenner.
 
Code:
#!/bin/bash
while read line; do
    if [[ $line == *CRITICAL* ]]; then
        datum=${line%%]*}
        datum=${datum#[}
        rest=${line#*]}
        echo $(date -d @$datum -u +"%Y-%m-%d %T") $rest
    fi
done < log.txt
Das Format der Zeit (+"....") noch anpassen. Habs aus dem 1. Posting genommen.

/edit: suche nach CRITICAL noch ergänzt
 
Zuletzt bearbeitet:
Da fehlt dann auch wieder die Suche nach CRITICAL, und bei einigen hundert Zeilen Log dürfte die Variante ziemlich langsam sein. Vertretbar, aber... langsam. Sinnvoller finde ich da nach wie vor die Verwendung von awk.

Nur CRITICAL anzeigen ist damit ebenfalls super einfach:

Code:
gawk '/CRITICAL/ && match($0, /^\[([0-9]+)\](.*)/, a) { print strftime("%Y-%m-%d %T", a[1]) a[2] }' log.txt

Achja, und das Format vom Datum/Zeit kannst du natürlich anpassen, siehe

http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html
 
Zuletzt bearbeitet:
Zurück
Oben