Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Linux Bash - Czyszczenie danych z czasem Unix

24 Wrz 2014 10:46 1056 8
  • Poziom 32  
    Witam,

    Zbieram dane z termometrów do pliku, a temperatura jest zapisywana jest z czasem Unix.
    W jaki sposób wyczyścić dane z pliku starsze niż 30 dni?

    Format danych:
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    Z góry dziękuję za pomoc.
  • Poziom 24  
    Jeśli koniecznie chcesz mieć to w bashu to możesz skorzystać z awk do parsingu pliku a potem zostawić tylko młodsze wpisy, ale myślę ze znacznie prościej (pod kątem zarówno tworzenia jak i czytelności kodu) byłoby napisać do tego prosty program w C.

    Mógłbyś też napisać konkretnie w czym problem bo teraz nie wiem czy masz problem z samym parsingiem pliku, ze sprawdzeniem różnicy czasów między aktualną datą a datą z pliku, czy też z usunięciem starszych wpisów.

    EDIT: ewentualnie, jeśli jesteś początkujący a zależy Ci tylko na ograniczeniu rozmiaru pliku logu, a wpisy temperatury są w pliku ustawione w porządku chronologicznym, to możesz ułatwić sobie zadanie i po prostu usuwać początkowe linijki/wpisy nie na podstawie ich daty, a na podstawie ich ilości - ale to się troszkę mija z założeniem które podałeś w poście.
  • Poziom 32  
    anonymousexd napisał:
    Jeśli koniecznie chcesz mieć to w bashu to możesz skorzystać z awk do parsingu pliku a potem zostawić tylko młodsze wpisy, ale myślę ze znacznie prościej (pod kątem zarówno tworzenia jak i czytelności kodu) byłoby napisać do tego prosty program w C.

    Nie musi być to w bashu, ale C nie znam w ogóle :(
    anonymousexd napisał:
    Mógłbyś też napisać konkretnie w czym problem bo teraz nie wiem czy masz problem z samym parsingiem pliku, ze sprawdzeniem różnicy czasów między aktualną datą a datą z pliku, czy też z usunięciem starszych wpisów.

    Skrypt odczytuje co 5min temperatury, zapisuje je do pliku i zbiera w nieskończoność. Gdy jest ich więcej to znów skrypt który rysuje wykresy zamula, dlatego chciałbym ograniczyć bazę do miesiąca, góra trzech.
    anonymousexd napisał:
    EDIT: ewentualnie, jeśli jesteś początkujący a zależy Ci tylko na ograniczeniu rozmiaru pliku logu, a wpisy temperatury są w pliku ustawione w porządku chronologicznym, to możesz ułatwić sobie zadanie i po prostu usuwać początkowe linijki/wpisy nie na podstawie ich daty, a na podstawie ich ilości - ale to się troszkę mija z założeniem które podałeś w poście.

    Odczyty układają się w jednej linii, od najstarszego do najnowszego-tak jak pokazałem w pierwszym poście.
  • Pomocny post
    Poziom 37  
    Skrypt:
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    By Twój zapis daty z pliku był zgodny z tym co zwraca "date" musiałem zwracana wartość pomnożyć przez 1000. Wynik jest zapisywany do pliku z nową nazwą, co oczywiście możesz zmienić. Jak będziesz mieć pytania to pisz, ale możliwe, że odpiszę dopiero wieczorem. Ustaw poprawne katalogi, zamiast xxxxx :-)

    Dodano po 1 [godziny] 26 [minuty]:

    Zapomniałem, że masz inaczej sformatowany plik wyjściowy! Przesyłam poprawioną wersję:

    Kod: bash
    Zaloguj się, aby zobaczyć kod
  • Poziom 32  
    Szczerze mówiąc to nie mam pojęcia co i jak Twój skrypt działa, ale gdy go użyłem to pozostawił po sobie pusty (nowy) plik.
    Twój skrypt:
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    W terminalu wyświetlił:
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    Moja baza nie ma jeszcze dużo danych, ponieważ zacząłem zbierać dane od nowa.
    Zaczyna się pierwszym wynikiem tak:
    Kod: bash
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Poziom 37  
    Zmień:
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    na
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Sorry, zły znak został po testach.
  • Poziom 32  
    Zmieniłem tak jak mówisz i teraz na ekranie wysypuje mi wszystkie dane z pliku
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    Nowy plik z danymi się tworzy czyli chyba będzie OK. Muszę nazbierać więcej danych.

    Mam parę pytań:
    1. Jak zrobić, aby skrypt nic nie wyświetlał? Myślę, że zlecę pracę sprzątania danych raz na dobę CRON'owi.
    2. Jak zmienić w skrypcie, aby dla testów skrypt wyczyścił dane starsze niż np 7 dni? Nie łapię tego czasu unix :(
  • Pomocny post
    Poziom 37  
    piterek-23 napisał:
    1. Jak zrobić, aby skrypt nic nie wyświetlał? Myślę, że zlecę pracę sprzątania danych raz na dobę CRON'owi.


    Usuń linie lub wstaw na początku linii znak #, np. tak:
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Dodano po 6 [minuty]:

    piterek-23 napisał:
    2. Jak zmienić w skrypcie, aby dla testów skrypt wyczyścił dane starsze niż np 7 dni? Nie łapię tego czasu unix


    Skrypt sprawdza bieżący czas i go zapamiętuje w zmiennej "timeNow:
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Następnie od "teraz" odejmuje jeden miesiąc:
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Jeden miesiąc to:
    1 godzina - 3600 sekund
    1 dzień - 86400 sekund
    1 tydzień - 604800 sekund
    1 miesiąc - 2629744 sekund
    1 rok - 31556926 sekund
    Tu możesz policzyć dowolny okres czasu: http://www.epochconverter.com/

    Dodano po 1 [minuty]:

    Czyli 7 dni to: 86400 * 7 = 604800
  • Poziom 32  
    Właśnie znalazłem wszystko w google i tak sobie przeliczam i miałem zapytać czy dobrze kombinuję, ale nie zdążyłem odpisać. Takie same wartości mi wyszły. Nie taki diabeł straszny jak go malują ;)

    Zrobiłem test na moich bazach danych i wygląda na to, że wszystko będzie OK.
    Przeogromnie dziękuję za pomoc-w sumie nie pomoc, a napisanie skryptu.