[BASH] Jak sprawdzić czy plik nie zmienił swojej liczby linijek??

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
rryk
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 206
Rejestracja: 04 mar 2008, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Kontakt:

[BASH] Jak sprawdzić czy plik nie zmienił swojej liczby linijek??

Post autor: rryk »

chce aby co chwile program sprawdzał czy plik nie zmienił swojej ilości linijek, jeśli zmieniłby i osiągną lub przewyższył podaną liczbę wykonywałby jakąś akcje i zaczynał od nowa ^^ schematycznie to wygląda tak:

Kod: Zaznacz cały

ustalone="5" #ustalamy ile ma być linijek żeby wykonać jakąkolwiek akcje
while [ 1 ];do #powtarzamy co chwile akcje
sleep 1 #obniżamy zużycie procka
old=$(cat plik|wc -l)
while [ 1 ];do #powtarzamy co chwile akcje 2
new=$(cat plik | wc -l) #sprawdzamy czy się zmieniło
done #zamykamy powtórzenie akcji 2
if [ $new -gt $old ] && [$new = $ustalone]; then cos1 #sprawdzamy czy jest inne oraz równe
elif [ $new -gt $old ] && [$new -gt $ustalone]; then cos2 #sprawdzamy czy jest inne oraz większe
fi #kończymy spradzanie
done #zamykamy powtórzenie akcji 1
ale to chyba nie zadziała - mógłby ktoś to sprawdzić bo aktualnie nie mam takiej okazji??
Ps. poprawiłem błąd ^^
Awatar użytkownika
f00sek
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 109
Rejestracja: 18 kwie 2009, 15:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [BASH] Jak sprawdzić czy plik nie zmienił swojej liczby linijek??

Post autor: f00sek »

Ten skrypt nie zadziała:D W jednym momencie sprawdzasz dwa razy to samo:P Spróbuj raczej bajer w stylu: liczbę linijek exportujesz:

Kod: Zaznacz cały

linijki=`wc -l plik`
export $linijki
I po sekundzie sprawdzasz z tą zmienną, ew. ją nadpisujesz. A, i chyba łatwiej jest zapisać wc -l plik, niż robić potok z catem.
System.out.println ("Java programmer");
Awatar użytkownika
rryk
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 206
Rejestracja: 04 mar 2008, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Kontakt:

Odp: [BASH] Jak sprawdzić czy plik nie zmienił swojej liczby linijek??

Post autor: rryk »

wiesz tylko co za różnica potok z catem a potok z cutem?? bo przecież mi potrzebna sama liczba czyli musiałbym jeszcze dopisać | cut -d" " -f1 a to co ja podałem schludniej wygląda ^^
więc mój skrypt powinien wyglądać tak:

Kod: Zaznacz cały

ustalone="5" #ustalamy ile ma być linijek żeby wykonać jakąkolwiek akcje
while [ 1 ];do #powtarzamy co chwile akcje
sleep 1 #obniżamy zużycie procka
old=$(cat plik|wc -l)
export $old
new=$(cat plik | wc -l) #sprawdzamy czy się zmieniło
if [ $new -gt $old ] && [$new = $ustalone]; then cos1 #sprawdzamy czy jest inne oraz równe
elif [ $new -gt $old ] && [$new -gt $ustalone]; then cos2 #sprawdzamy czy jest inne oraz większe
fi #kończymy spradzanie
done #zamykamy powtórzenie akcji 1
Awatar użytkownika
kamilsilver
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 105
Rejestracja: 06 lis 2008, 21:53
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: [BASH] Jak sprawdzić czy plik nie zmienił swojej liczby linijek??

Post autor: kamilsilver »

Pisałem od nowa, ale przerwałem, gdy przypomniałem sobie, że miałem podobny problem. Mianowicie tworzyłem plik pingowanie.txt w którym trafiały kolejne pomiary pinga. skrypt miał mi pokazywać na bieżąco zawartość pliku w konsoli. Jak przychodziła nowa linijka to miał mi ją raz wyświetlić(dodać) ale tylko raz.

Tylko jest mały błąd, Jeśli zakładasz, że plik nie może mieć puste linie, to trzeba przerobić plik (jeśli jest pusta linia to się zapętla - trzeba dodać warunek sprawdzenia czy doszło do końca pliku, jeśli nie koniec pliku przejdź do kolejnej linii, jak koniec to czekaj na nową linię)

Kod: Zaznacz cały

#!/bin/bash
linia=1 # aktualna sprawdzana linia
clear
while [ 1 ]; do
	if [ -f pingowanie.txt ]; then ilemalini=$(cat pingowanie.txt | wc -l); fi # sprawdź ile ma teraz plik linii
	while [ -z "$LINE" ]; do 
		if [ ! -f pingowanie.txt ]; then
			echo "Przerwano sprawdzanie łącza. Plik pomiaru nie istnieje"
			exit 1;
		fi
		
		LINE="$(sed -n ${linia}p pingowanie.txt)"
		if [ ! -z "$LINE" ]; then
			let nrlinii=$linia-1
			echo -ne "$nrlinii\t$LINE"
			echo
		fi
		if [ $ilemalini -lt $linia ]; then
			echo -n "czekanie na kolejny pomiar";
			sleep 1;
			echo -ne "\r        \r"
		fi
	done;
	
	LINE="" 
	let linia+=1 
	#echo "Numer lini $nrlinii / dlugosc pliku $(cat pingowanie.txt | wc -l)"
	#if [ ! $(cat pingowanie.txt | wc -l) -gt $nrlinii ]; then 
	#	clear
	#	linia=1
	#fi
done
To ogólny zarys, teraz tylko musisz dodać warunki do sprawdzania czy nr linii = > granica - tam gdzię masz echo z linią (okolice: echo -e "$nrlinii\t$LINE") - tam też trzeba zmienić lekko warunek

Najlepiej skopiuj sobie zawartość stwórz skrypt, stwórz najpierw pusty plik pingowanie.txt, następnie odpal w konsoli skrypt i zacznij edytować plik pingowanie.txt. Dodaj jedna linijkę, zapisz, dodaj kilka niepustych linijek zapisz itd.

U mnie jest mały problem, bo jak jest pusta linijka to się zatrzymuje, aby tego uniknąć, w pętli w której się zatrzymuje, trzeba dodać warunek, że jeśli aktualna linia < lini pliku zwieksz wskaźnik aktualnej linii.

Po sesji jak nie zapomnę i będę miał chęci to dokładniej to przerobię. Choć uważam, że już z tym powinienieś sobie poradzić, wystarczy kilka ifów powstawiać i zmienić warunek w drugim whilu.

Po co ostatni warunek? już nawet nie pamięta.


Wersja po zamianie (zostanie zmienione po sesji w wolnym czasie):

Kod: Zaznacz cały

#!/bin/bash
plik='plik.txt'
linia=1 # aktualna sprawdzana linia
clear
while [ 1 ]; do
	if [ -f "$plik" ]; then ilemalini=$(cat "$plik" | wc -l); fi # sprawdź ile ma teraz plik linii
	while [ -z "$LINE" ]; do # cos tu trzeba zmienic (warunek)
		if [ ! -f "$plik" ]; then
			echo "Plik nie istnieje"
			exit 1;
		fi
		
		LINE="$(sed -n ${linia}p "$plik")"
		if [ ! -z "$LINE" ]; then # zmienić warunek ifa
			# dorzucić ifa z granicami
			let nrlinii=$linia-1
			echo -e "$nrlinii\t$LINE"
			echo
		fi
		if [ $ilemalini -lt $linia ]; then
			echo -n "czekanie na kolejny pomiar";
			sleep 1;
			echo -ne "\r        \r"
		fi
	done;
	
	LINE="" 
	let linia+=1 
	#echo "Numer lini $nrlinii / dlugosc pliku $(cat pingowanie.txt | wc -l)"
	#if [ ! $(cat pingowanie.txt | wc -l) -gt $nrlinii ]; then 
	#	clear
	#	linia=1
	#fi
# i ogólnie pozmieniać napisy
done
Te LINE będzie trzeba zamienić na coś związane z ilością linii pliku, ale jak pisałem po sesji się tym zajmę.

P.S: Skrypt jest stary i zawiera kilka literówek błędnych zapisów.
Temat rozwiązany? Dodaj [solved] w tytule tematu :)
Inny OS => Debian Squeeze (testing)
Awatar użytkownika
rryk
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 206
Rejestracja: 04 mar 2008, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Kontakt:

Odp: [BASH] Jak sprawdzić czy plik nie zmienił swojej liczby linijek??

Post autor: rryk »

U mnie narazie wygląda to w ten sposób:

Kod: Zaznacz cały

#!/bin/bash
plik='plik'
linia=1 # aktualna sprawdzana linia
ustalone=5
clear
while [ 1 ]; do
	if [ -f "$plik" ]; then ilemalini=$(cat "$plik" | wc -l); fi # sprawdź ile ma teraz plik linii
	while [ -z "$LINE" ]; do # cos tu trzeba zmienic (warunek)
		if [ ! -f "$plik" ]; then
			echo "Plik nie istnieje"
			exit 1;
		fi
		
		LINE="$(sed -n ${linia}p "$plik")"
		if [ ! -z "$LINE" ]; then # zmienić warunek ifa
			# dorzucić ifa z granicami
			let nrlinii=$linia
			if [ $nrlinii = $ustalone ]; then echo "Plik $plik osiągną ustaloną ilość linijek $ustalone" #sprawdzamy czy jest inne oraz równe
			elif [ $nrlinii -gt $ustalone ]; then echo "Plik $plik przewyższył ustaloną ilość linijek: ilość linii=$nrlinii" #sprawdzamy czy jest inne oraz większe
			fi #kończymy sprawdzanie
		fi
		if [ $ilemalini -lt $linia ]; then
			sleep 1;
		fi
	done;
	LINE="" 
	let linia+=1 
# i ogólnie pozmieniać napisy
done
zmieniłem to aby jeśli jest 1 linijka w pliku wyświetlało jako pierwszą a nie 0 linijkę (przez co nie występuje błąd jeśli plik jest pusty) i dodałem odpowiednie if'y z tym whilem to nie wiem nie znam się aż na tyle dobrze na zależnościach co ty ^^ jeszcze pozostało aby skrypt w jakiś sposób czyścił plik przy wyjściu bo jeśli plik nie zostanie wyczyszczony przy następnym uruchomieniu skryptu jeśli plik miał więcej linijek niż ustalone zostaną wykonane najpierw czynności dla osiągnięcia limitu a następnie dla przewyższających limitów, a tego chce uniknąć
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości