Bash - zistenie či je riadok z logu najviac hodinu starý

Programovacie jazyky, rady, poradňa...
xadman
Medium Star
Medium Star
Príspevky: 305
Registrovaný: 09 mar 2011, 17:02

Bash - zistenie či je riadok z logu najviac hodinu starý

Príspevok od používateľa xadman »

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
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Bash - zistenie či je riadok z logu najviac hodinu starý

Príspevok od používateľa BX »

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.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Bash - zistenie či je riadok z logu najviac hodinu starý

Príspevok od používateľa audiotrack »

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
Hardcore addict
Používateľov profilový obrázok
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ý

Príspevok od používateľa harrison314 »

Nie je jednoduchsie spravit maly C-eckovysky program, ktory tie riadky vyfiltruje a potom ho pouzit v bash-i?
Fabo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
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ý

Príspevok od používateľa Fabo »

Vyfiltrovat riadky je banalita.

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
ked najdes zaznam starsi ako hodinu, das tam koncim=1 a hotovo
xadman
Medium Star
Medium Star
Príspevky: 305
Registrovaný: 09 mar 2011, 17:02

Re: Bash - zistenie či je riadok z logu najviac hodinu starý

Príspevok od používateľa xadman »

@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:

Kód: Vybrať všetko

tac test | \
while read CMD; do
    echo $CMD
done
to $CMD by som chcel nejako passnúť do awk, len stále som nikde som nenašiel ako
Fabo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
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ý

Príspevok od používateľa Fabo »

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ý
xadman
Medium Star
Medium Star
Príspevky: 305
Registrovaný: 09 mar 2011, 17:02

Re: Bash - zistenie či je riadok z logu najviac hodinu starý

Príspevok od používateľa xadman »

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

Kód: Vybrať všetko

TIME="%H:%M:%S"
FROM=$(date +%b" "%d" "$TIME -d "-1 hour")
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ť?
Napísať odpoveď