Bash - zistenie či je riadok z logu najviac hodinu starý
Bash - zistenie či je riadok z logu najviac hodinu starý
Ahoj,
robím taký menší script, ktorý má za úlohu čítať log súbor od spodu riadok po riadku až pokým nenatrafí na riadok, ktorý je viac ako hodinu starý.
Nevie niekto, či má na toto `awk` alebo iný package implementovanú funkciu? Žeby som mu poslal len riadok, formát času a on mi hodí boolean hodnotu.
Príklad inputu:
Aug 21 21:39:01 ubuntu CRON[4805]: pam_unix(cron:session): session closed for user root
robím taký menší script, ktorý má za úlohu čítať log súbor od spodu riadok po riadku až pokým nenatrafí na riadok, ktorý je viac ako hodinu starý.
Nevie niekto, či má na toto `awk` alebo iný package implementovanú funkciu? Žeby som mu poslal len riadok, formát času a on mi hodí boolean hodnotu.
Príklad inputu:
Aug 21 21:39:01 ubuntu CRON[4805]: pam_unix(cron:session): session closed for user root
Re: Bash - zistenie či je riadok z logu najviac hodinu starý
Awk spraví všetko. Dátum a čas si vyberieš jednoducho (prvé tri stĺpce). Pomocou príkazu date si z toho spravíš napríklad timestamp a porovnáš s current timestamp, ktorý si vytvoríš na začiatku scriptu.
A ak chceš iba true/false, tak nemusíš čítať ani od spodku.
A ak chceš iba true/false, tak nemusíš čítať ani od spodku.
-
audiotrack
VIP
- Príspevky: 25958
- Registrovaný: 09 sep 2005, 18:39
- Kontaktovať používateľa:
Re: Bash - zistenie či je riadok z logu najviac hodinu starý
keď tam má záznam z cronu, tak to bude zrejme nejaký syslog a teda predpokladám že bude dosť veľký. Ak chce poslednú hodinu, zbytočne bude načítavať milion prvých záznamov keď vie že mu aj tak vrátia false. Pokiaľ teda nie je v unixe čítanie od konca nejaké komplikované (ale asi nie keďže sú v ňom priamo zakomponované veci ako tail a podobne), tak odporúčam čítať od konca
-
harrison314
Hardcore addict
- Príspevky: 8217
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: Bash - zistenie či je riadok z logu najviac hodinu starý
Nie je jednoduchsie spravit maly C-eckovysky program, ktory tie riadky vyfiltruje a potom ho pouzit v bash-i?
-
Fabo
Hardcore addict
- Príspevky: 6810
- Registrovaný: 16 nov 2007, 17:23
- Bydlisko: 's Chravenhache
- Kontaktovať používateľa:
Re: Bash - zistenie či je riadok z logu najviac hodinu starý
Vyfiltrovat riadky je banalita.
ked najdes zaznam starsi ako hodinu, das tam koncim=1 a hotovo
Kód: Vybrať všetko
#!/bin/bash
koncim = 0
i = 1
while [ $koncim -eq 0 ]
do
cat subor | tail -n $i | head -n 1 | awk [ tu si urob co potrebujes}
i=$((i + 1))
done
Re: Bash - zistenie či je riadok z logu najviac hodinu starý
@Fabo, tak ako hovorí audio, ja nemôžem cat-ovať celý súbor, lebo to zabere strašne veľa času.
na čítanie riadok po riadku odspodu som si našiel toto:
to $CMD by som chcel nejako passnúť do awk, len stále som nikde som nenašiel ako
na čítanie riadok po riadku odspodu som si našiel toto:
Kód: Vybrať všetko
tac test | \
while read CMD; do
echo $CMD
done-
Fabo
Hardcore addict
- Príspevky: 6810
- Registrovaný: 16 nov 2007, 17:23
- Bydlisko: 's Chravenhache
- Kontaktovať používateľa:
Re: Bash - zistenie či je riadok z logu najviac hodinu starý
Pravda. Zase mačku môžeš vynechať a hodiť tam rovno chvost. Rozumná implementácia urobí to čo tac - bude čítať odzadu.
Čo sa týka passnutia do awk, tak urob to isté čo sa deje tam, len medzi do a done nedáš echo ale awk. A mám dojem že pred done má byť tiež ; ale nie som si istý
Čo sa týka passnutia do awk, tak urob to isté čo sa deje tam, len medzi do a done nedáš echo ale awk. A mám dojem že pred done má byť tiež ; ale nie som si istý
Re: Bash - zistenie či je riadok z logu najviac hodinu starý
to mi je jasné že to bude v tom while, len neviem presne ako má vyzerať celý awk príkaz
Takto si zachytím aktuálny čas a čas hodinu dozadu
keby chcem zistiť, koľko riadkov odspodu je starých menej než hodinu, tak to spravím takto
awk '($0 >= from){++n}END{print n}' from="$(LC_TIME=C date +'%b %d $TIME' -d -1hour)" $FILE
skúšal som tam namiesto $FILE dať len to $CMD ale nefunguje. Vedel by niekto poradiť ako by som to mohol prerobiť?
Takto si zachytím aktuálny čas a čas hodinu dozadu
Kód: Vybrať všetko
TIME="%H:%M:%S"
FROM=$(date +%b" "%d" "$TIME -d "-1 hour")awk '($0 >= from){++n}END{print n}' from="$(LC_TIME=C date +'%b %d $TIME' -d -1hour)" $FILE
skúšal som tam namiesto $FILE dať len to $CMD ale nefunguje. Vedel by niekto poradiť ako by som to mohol prerobiť?