ďťż
 
 
   Sprawdzanie czy plik nie zmienił ilości linijek - bash
 
 

Tematy

 
    
 

 

 

 

Sprawdzanie czy plik nie zmienił ilości linijek - bash





rryk - 26-08-2009 19:18
Napisałem w innym temacie, w którym stosowałem niedziałający sposób sprawdzania lecz nikt nie podjął się jego naprawy, a więc zwrócę się z prośbą o stworzenie nowego działającego skryptu na ciągłe sprawdzanie ilości linijek danego pliku jeżeli ta wielkość osiągnie ustaloną wartość wtedy wyświetli się raz komunikat, jeżeli zaś przekroczy pojawi się inny komunikat, który będzie się powtarzać tylko w wypadku gdy liczba linii się zmieni.



tomii - 26-08-2009 20:20
Tzn. sprawdzamy ile plik ma linijek i jak ma, mniej niż x to komunikat1, jak ilość równą x to kompunikat2, a jak więcej niż x to komunikat3?



rryk - 26-08-2009 22:14
Tak, chociaż jeśli plik ma mniej to nie koniecznie - istotne jest jednak to aby pojawiał się jeden komunikat za każdym razem jeżeli ilość linijek się zmieni, a nie w nieskończoność jeśli plik ciągle będzie miał 2 linijki.



tomii - 26-08-2009 22:16
Czyli ilość linijek do porównanie nie jest z góry znana tylko trzeba ją zapisywać?



winnetou - 27-08-2009 00:00
##################################
# Author:  Przemysław "winnetou" Wilkosz      #
# Licence:  Creative Commons Attribution        #
# Desc:    Line counter for files                      #
##################################

#!/bin/sh

FILE=$1
MAX_LINES=$2
EQUAL=0
OLD_LINES=0
OVERDOSE=0
MSG1="Liczba linijek w pliku osiagnela dopuszczalne maksimum"
MSG2="Liczba linijek przekroczyla dopuszczalne maksimum."

while [ 1 ]
do
 LINES=`wc -l $FILE | awk '{print $1}'`
 if [ $LINES -eq $MAX_LINES ]
 then
  if [ $EQUAL -eq 0 ]
  then
  EQUAL=1
  echo "`date`: $MSG1"
  else
  continue
  fi
 elif [ $LINES -gt $MAX_LINES ] && [ $OVERDOSE -eq 0 ]
 then
  OVERDOSE=1
  OLD_LINES=$LINES
  echo "`date`: $MSG2"
 elif [ $LINES -gt $MAX_LINES ] && [ $OVERDOSE -eq 1 ]
 then
  if [ $LINES -gt $OLD_LINES ]
  then
  echo "`date`: $MSG2"
  OLD_LINES=$LINES
  fi
 fi
 sleep 2
done



rryk - 27-08-2009 09:03
Jeszcze nie testowałem ale powinno działać - czy według tej licencji, którą objąłeś dany kod - mogę modyfikować, łączyć i przerabiać kod oraz go rozprowadzać byle by tylko umieścić cię w rubryce Autorzy albo współtwórcy? I czy ewentualnie mógłbyś zmienić licencje ponieważ przez twój kod od sprawdzania musiałbym zmienić licencję całego skryptu.



winnetou - 27-08-2009 09:27

Uznanie autorstwa (ang. Attribution)
Wolno kopiować, rozprowadzać, przedstawiać i wykonywać objęty prawem autorskim utwór oraz opracowane na jego podstawie utwory zależne pod warunkiem, że zostanie przywołane nazwisko autora pierwowzoru.

1.
Możesz kopiować i rozprowadzać w dowolnych mediach wierne kopie kodu źródłowego Programu w otrzymanej formie pod warunkiem, że w widoczny sposób i odpowiednio podasz na każdej kopii właściwą informację o prawie autorskim i zrzeczenie się uprawnień z tytułu gwarancji; wszelkie napisy informacyjne na temat Licencji i faktu nieudzielania gwarancji musisz chronić przed uszkodzeniem, zaś wszystkim innym odbiorcom Programu musisz wraz z Programem wręczać egzemplarz niniejszej Licencji.

Możesz pobierać opłatę za fizyczną czynność przekazania kopii i według własnej decyzji możesz za opłatą proponować ochronę gwarancyjną.

2.
Możesz modyfikować swoją kopię czy kopie Programu oraz dowolne jego części, tworząc przez to pracę opartą na Programie, jak również kopiować i rozprowadzać takie modyfikacje i pracę na warunkach podanych w pkt.1 powyżej - pod warunkiem przestrzegania całości poniższych wymogów:

a.
Musisz spowodować umieszczenie na zmodyfikowanych plikach widocznej informacji o tym, że dane pliki zostały przez ciebie zmienione, wraz z datą dokonania zmian.

b.
Musisz doprowadzić do tego, aby każda rozpowszechniana lub publikowana przez ciebie praca, która w całości lub części zawiera Program, albo pochodzi od niego lub jego części, była w całości i bezpłatnie licencjonowana dla wszelkich stron trzecich na warunkach niniejszej Licencji.

c.
Jeżeli zmodyfikowany program podczas korzystania z niego w normalnym trybie odczytuje polecenia interaktywnie, musisz spowodować, aby po uruchomieniu (użyty w interaktywny sposób w najzwyklejszym trybie), wydrukowywał on lub wyświetlał powiadomienie o odnośnym prawie autorskim i braku gwarancji (ewentualnie o zapewnianiu gwarancji przez ciebie), oraz o tym, że użytkownicy mogą redystrybuować ten program na niniejszych warunkach wraz z informacją, jak użytkownik może zapoznać się z treścią niniejszej Licencji. (Wyjątek: jeśli sam Program jest interaktywny, ale normalnie nie drukuje takiego powiadomienia, twoja praca oparta na nim też nie musi wydrukowywać takiego powiadomienia).
Tak czy siak musiałbyś umieścić mnie jako autora. Nawet jeżeli jawnie nie podam na jakiej licencji rozpowszechniany jest skrypt obowiązuje Cię wskazanie autora. Jak bardzo chcesz mogę zmienić na GNU/GPL ale wtedy jak wykorzystasz chociaż linijkę z tego skryptu całą swoją pracę będziesz musiał udostępnić na GNU/GPL.

A skrypt działa testowany w warunkach bojowych.



rryk - 27-08-2009 09:47
Wiem, spokojnie podam Cię jako autora, nie musisz się martwić. Ale chodzi tu o samą licencje - bo ja jeszcze nie zdecydowałem jaką wybrać dla swojego projektu, a z tego co czytałem o Creative Commons Attribution to musiałbym również w tym przypadku zmieniać licencje na Creative Commons Attribution bo tak jak w przypadku GNU/GPL użyłem części kodu opatrzonego tą licencją.

Skrypt działa wyśmienicie nawet lepiej niż przypuszczałem. Tylko dziwi mnie jedno po co tam ,,OVERDOSE'' i jego zależności w wyświetlaniu MSG2 - jak na to patrzę: elif [ $LINES -gt $MAX_LINES ] && [ $OVERDOSE -eq 0 ]
 then
  OVERDOSE=1
  OLD_LINES=$LINES
  echo "`date`: $MSG2"
 elif [ $LINES -gt $MAX_LINES ] && [ $OVERDOSE -eq 1 ]
 then
  if [ $LINES -gt $OLD_LINES ]
  then
  echo "`date`: $MSG2"
  OLD_LINES=$LINES
  fi
 fi to przychodzi mi tylko jedno powiedzenie: Masło maślane i masłem polane.

A co do samego projektu to może widziałeś mój temat na forum Ubuntu: InfoSMS. Po prostu jego głównym zadaniem jest informowanie nas o stanie komputera. Obecnie jestem na etapie dodawania funkcji MSG GG na podstawie ekg2, a następnie dodam nk i może pocztę (która już była dodana ale zbyt szybko i kod kuł w oczy).



winnetou - 27-08-2009 09:55
Pisałem na szybko i nie optymalizowałem :) A $OVERDOSE w wersji pre-alpha pomógł mi zatrzymać powtarzający się komunikat o przekroczeniu maksymalnej liczby linijek ;] Wieczorem może powalczę z optymalizacją ;] Zresztą pousuwaj i eksperymentuj :))



rryk - 27-08-2009 10:06
Wolę żebyś ty się zajął optymalizacją - ja akurat w te klocki to cienki jestem - jak skończę wersje pre-alpha swojego projektu spędzę co najmniej pół roku na uporządkowaniu i optymalizacji wtedy oddam skrypt w ręce użytkowników.

Ps. Możesz być umieszczony w ,,Credits'' a nie Autorzy bo podejrzewam, że po tej pomocy nasza współpraca nad tym projektem się zakończy, a co za tym idzie pielęgnować i implementować nowe funkcję będę musiał sam - chyba, że jednak chcesz dalej się nim zajmować? A co do samego wyglądu ,,credits'' to wyglądać będzie w ten sposób:
......<bla bla bla informacje o mnie bla bla>.......

CREDITS:
Specjalne podziękowania dla:
-użytkowników forum UBUNTU.PL oraz DEBIAN.LINUX.PL
-KamilSilvera za pomoc i wsparcie techniczne
-Przemysława "winnetou" Wilkosza za kod dotyczący sprawdzania ilości linijek w danym pliku i jego optymalizację (moduł ekg2)
-człowieka, dzięki któremu ten projekt powstał, a którego prośba została na forum odrzucona'



fnmirk - 27-08-2009 12:06
rryk, chciałbym Cię uświadomić, że każdy tekst umieszczony na tym forum podlega licencji, o której wspomniał winnetou lub podobnej.



winnetou - 27-08-2009 19:54
Wersja poprawiona. "Ciężki" awk zastąpiony "lżejszym" cut, zmodyfikowany warunek w jednym elif i wywalony jeden if. Oraz dodane komentarze praktycznie do każdej linijki. Teraz powinno być wszystko jasne.

#################################
# Author:  Przemysław "winnetou" Wilkosz    #
# Jabber:  winnetou@jabster.pl                    #
# E-mail:  wilkosz.p@gmail.com                  #
# Licence:  Creative Commons Attribution    #
# Desc:    Line counter for files                  #
#################################

#!/bin/sh

# First param given to scrip it's file name you want to watch
FILE=$1

# Second param it's maximum allowed lines.
MAX_LINES=$2

# Sepcial flag set to 1 if number of lines in file is equal to allowed maximum
EQUAL=0

# Special flag that informs that lines in file exceeded allowed maximum
EXCEEDED=0

#  Caiable that handles number of lines in file before change
OLD_LINES=0

# When number of lines in file is equal to allowed maximum show this message
MSG1="Liczba linijek w pliku osiagnela dopuszczalne maksimum"

# When numer of lines in file exceed allowed maximum show this message
MSG2="Liczba linijek przekroczyla dopuszczalne maksimum."

# Begin infinity loop
while [ 1 ]
do

 # read number of lines in watched file
 LINES=`wc -l $FILE | cut -d " " -f 1`

 # if $LINES is equal to $MAX_LINES and flag $EQUAL is not set
 if [[ $LINES -eq $MAX_LINES && $EQUAL -eq 0 ]]
 then # then

  # set the $EQUAL flag to aviod dispalyn warning in each loop run
  EQUAL=1

  # and dispaly warning message
  echo "`date`: $MSG1"

 # else if $EXCEEDED flag is not set (we haven't exceeded $MAX_LINES) and $LINES is greater then
 # $MAX_LINES (it's the first time when we exceeded maximum)
 #
 # This is true expression at the first excess. Then it always false so there's no need to check second part
 # of expression so the script runs faster
 elif [[ $EXCEEDED -eq 0 && $LINES -gt $MAX_LINES ]]
  then # then

  # set $EXCEEDED flag to avoid entering this part of if statement
  EXCEEDED=1

  # save current number of lines
  OLD_LINES=$LINES

  # print error message
  echo "`date`: $MSG2"

 # else if $LINES is greater then $MAX_LINES and  $OLD_LINES (we have added some lines to watch file)
 elif [[ $LINES -gt $MAX_LINES && $LINES -gt $OLD_LINES ]]
 then # then

  # print error message
  echo "`date`: $MSG2"

  # save current number of lines
  OLD_LINES=$lINES

 # end if statement
 fi

 # wait with next run for 2 seconds
 sleep 2

# end of loop
done Jeżeli to ma działać jako osobny skrypt to mogę dorobić funkcję sprawdzającą czy podano wymaganą liczbę parametrów oraz coś w stylu --usage. Jeżeli zrobisz ^c^v do swojego kodu to te funkcje będą zbędę ewentualnie sam je dopiszesz już jak Ci trzeba :)

@fnmirk winnetou a nie winnetu :))



rryk - 27-08-2009 20:37
Nie, to będzie działać jako część innego skryptu, a co do sprawdzania czy wszystkie parametry są podane to raczej nie musisz się trudzić. Ale nadal nie odpowiedziałeś na moje pytanie: masz zamiar dalej współpracować, czy nie i czy ewentualny wpis w ,,credits'', który tobie zaproponowałem to Ci odpowiada?

Edycja:
Zapomniałem podziękować. I choć nie mogę teraz sprawdzić czy działa - nie jestem w domu i nie mam dostępu do Linuksa - to mam 100% pewność, że działa.

Edycja 2:
Tak mi się teraz, jak już w domku jestem, przypomniało po co awk, po co cut? Nie lepiej zastosowanie "najlżejszej" technologii?

LINES=`cat $FILE | wc -l` Edycja 3:
I jeszcze dwie sprawy: Po pierwsze dlaczego stosujesz angielskie komentarze? I jeszcze jedno dlaczego stosujesz `` a nie $()? Niby żadna różnica ale to ``, mnie się czasem mylą ze zwykłym '' (a co do komentarzy to zbędne skoro wytłumaczyłeś o co chodzi to po co drugi raz słuchać tego samego).



winnetou - 27-08-2009 22:35
Jeśli chodzi o pomoc to zawsze jest forum/PM/jabber więc jak będę w stanie i będę miał wolną chwilę to czemu nie. Ale nie rzucę wszystkiego co mam tylko po to żeby napisać fragment kodu czy debugować już istniejący - nie jest to moim priorytetem chwilowo mam inne zmartwienia na głowie :) Wpis w Credits czemu nie możesz ewentualnie dopisać do niego JIDa :))

A skrypt testowałem tak:
- utworzyłem plik: touch plik.txt - na jednej konsoli odpaliłem skrypt: sh file_watch ~/plik.txt 5 - na drugiej konsoli klepnąłem: for i in `seq 1 10`; do echo $i >> ~/plik.txt; sleep 6;done - trzeciej konsoli: watch -n 1 cat ~/plik.txt W ten sposób na trzeciej konsoli co sekundę wyświetlało mi zawartość pliku ~/plik.txt. Druga konsola co 6 sekund dopisywała do pliku cyfrę oraz znak nowej linii. A na pierwszej konsoli obserwowałem wynik działania skryptu. W momencie gdy do pliku została wpisana liczba 5 na pierwszej konsoli pojawił się komunikat spod zmiennej $MSG1 kolejne linijka powodowały wyświetlenie $MSG2. W momencie gdy pętla z drugiej konsoli zakończyła działanie, plik nie zmieniał zawartości i na pierwszej konsoli nie pokazywały się nowe komunikaty. Zdaję sobie sprawę, z tego że nie jest to wystarczający zestaw testowy ale w domyślnym zastosowaniu się sprawdził.

P.S.
W razie problemów z działaniem daj cynk pomyślimy i poprawimy w miarę możliwości :)

P.S.2
Na zdrowie bierz i korzystaj :)

P.S.3

@fnmirk nic się nie stało

DODANO
Można ale wcale nie jestem pewien czy to jest "lżejsze" rozwiązanie :) Przy kat dodatkowo dochodzi Ci "męczenie konsoli" i dodatkowe wywołania funkcji wejścia/wyjścia.



rryk - 27-08-2009 22:58
Z tym cat to fakt nie przemyślałem tego dobrze, ale w końcu człowiek uczy się całe życie. Zaś co do samego skryptu najwyraźniej spisuję się wyśmienicie, teraz wystarczy poprawić funkcje kill no i wprowadzić nk, a potem już tylko integracja, a może raczej interakcja z paroma pythonkami. No i wydanie alfa, potem tylko instalator i mamy betę, a potem pomyślimy.
Ps. Przeczytaj Edycje 3 z poprzedniego mojego posta



winnetou - 27-08-2009 23:12
Odnośnie komentarzy:
Dobry kod to taki gdzie na jedną linijkę kodu przypada 10 linii komentarza. Dlaczego? Choćby dla tego, że jak zaglądniesz do tego za pół roku to możesz nie wiedzieć o co chodzi w danym momencie a dochodzenie do tego podczas analizy poprzednich fragmentów kodu jest męczące.

Dlaczego komentarze po angielsku? jakoś tak z przyzwyczajenie większość programów jakie pisze ma angielskie komentarze, nazwy zmiennych i komunikaty. A to przede wszystkim dlatego, że nigdy nie wiesz kto zaglądnie do kodu i kto go będzie używał. Poza tym zdarzało mi się prosić "zagraniczniaków" (m.in deweloperów z Sun Microsystems Inc ;]) o pomoc a dla nich kod po polsku byłby tak samo niezrozumiały jak dla nas w suahili :)

Ad apostrofów.
` to jest tak zwany lewy apostrof służy m.in do umieszczania w zmiennych wyników działania polecenia.

Pojedynczy apostrof znosi działanie znaków specjalnych w poleceniach typu echoi innych. Dzięki temu można umieścić sekwencje typu: echo ' ble \ble' i zostanie wypisane wszystko tak jak jest w apostrofie. Przy zastosowaniu standardowego podwójnego apostrofu znaki specjalne trzepa "wyeskejpować" czyli poprzednia konstrukcja musiałaby wyglądać tak: echo "ble \\ble



Hardiel - 28-08-2009 01:14
Nie zgadzam się. Komentować powinno się najważniejsze fragmenty a nie cały kod. Co do języka najlepiej używać angielskiego a przede wszystkim nie mieszać języków np. polski z angielskim. Ważnym elementem są również wcięcia w kodzie, które sprawiają że jest czytelniejszy.

Pozdrawiam.



winnetou - 28-08-2009 01:23
Jeżeli piszę kod tylko dla siebie to:
- zmienne nazywam tak, że nawet po 2 latach wiem do czego służą i/lub komentuję ich przeznaczenie
- nie komentuje całego kodu tylko funkcje, czy ważniejsze fragmenty ale zdarza się tak że jakaś funkcja ma 10 linijek kodu a komentarzy jest na drugie tyle bo akurat tak pasuje czy wymyśliłem jakiś "skrótowy" przebieg, o którym pewnie za tydzień bym zapomniał.

Jeżeli piszę kod dla kogoś to komentuje jak najwięcej i jak najobszerniej, żeby mi nikt nie zawracał głowy a jak już zawróci to żebym nie miał problemów z "co autor miał na myśli" i dlaczego tak a nie inaczej.

Dużo zależy od tego dla kogo się piesze kod, jak bardzo jest skomplikowany i jak często będzie się do niego zaglądać. Ale z tym to jest tak samo jak ze wszystkim innym. Ilu programistów/koderów tyle podejść do spraw komentarzy.

Fakt nie powinno się mieszać języków, moja wina zawaliłem tutaj. Ale pierwotnie kod był nieskomentowany i po polsku, potem po prostu zapomniałem zmienić komunikaty. Ale jeszcze nikt nie napisał bezbłędnego i idealnego kodu za 2 posiedzeniami.



thalcave - 29-08-2009 20:18
Myślałem, że jeszcze nikt nie napisał kodu idealnego.

Co do komentarzy to każdy ma troszkę inne podejście. Sam też nie lubię komentowania każdej linii kodu. Raczej komentarze grupowe, odnoszące się do kilku (kilkunastu) linii kodu.
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • minister.pev.pl

  •  

     


     

     
    Copyright 2003. MĂłj serwis