Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Nasz forumowy kolega — Minio — popełnił tekst ku przestrodze młodych (i trochę starszych) skrypciarzy.
Jeśli ktoś nie wie co jest złego na przykład w:
head -n15 file.txt |tail -n1 cat file.txt | grep -i foo
powinien się koniecznie zapoznać z tymże.
http://minio.jogger.pl/2009/11/21/popularne-bledy-p … ptow-powloki/
Offline
Czekam na piękne kobiety, drogie alkohole i szybkie samochody.
;)
Offline
Minio napisał(-a):
Czekam na piękne kobiety, drogie alkohole i szybkie samochody.
;)
A mogą być szybkie kobiety, drogie alkohole i piękne samochody?? ;)
Offline
winnetou napisał(-a):
Minio napisał(-a):
Czekam na piękne kobiety, drogie alkohole i szybkie samochody.
;)A mogą być szybkie kobiety, drogie alkohole i piękne samochody?? ;)
z XMPP pewnych osobników:
[22:32:26] azhag: http://forum.dug.net.pl/viewtopic.php?pid=134358#p134358 ;)
[22:33:08] Minio: :)
[22:33:23] Minio: czekam na piękne kobiety, drogie alkohole i szybkie samochody ;)
[22:34:57] azhag: przykro mi, obecnie w asortymencie są tylko szybkie kobiety, piękne alkohole i drogie samochody
[22:35:48] Minio: no cóż. Lepszy rydz niż nic ;)
;)
Offline
Pozwolę sobie zauważyć, że alkohol nie musi być piękny, ważne żeby poniewierał ;)
Offline
I że nawet niepiękne kobiety ładnieją po nim w oczach ;) .
Offline
fajny tekst, ale pozwole sobie na kilka uwag:
1. najpopularniejszym programem wymagajacym przyjmowania pliku przez stdin jest tr
2. przelacznik -q w grepie ma jedna istotna zalete - konczy przeszukiwanie na pierwszej znalezionej linii
3. zastanowic sie nalezy nad wydajnascia head|tail vs awk przy bliskich poczatku liniach w dlugich plikach
4. zmienne z bialymi znakami nie zawsze powinny byc ujmowane w cudzyslowia - np. for a in "$ttt"; do echo $a; done niekoniecznie bedzie dzialac tak jakbysmy tego oczekiwali
5. LANG=C jest przydatne tez przy problemie kropka vs przecinek ... czesc programow uzywa do tego locale a czesc nie wiec w skryptach lepiej robic z LAN=C
6. sama wieloliniowosczmiennych obslugiwanych po linii jest kiepskim argumentem za plikami tymczasowymi ... to mozna robic na ogol w samej powloce, raczej wymogi pewnych programow ...
Edit co do samego skryptu krory byl inspiracja mnie razi troche masa wywolan awk aby uzyskac zmienne shelowe tylko po to aby potem to wypisac przy uzyciu echo ... mozna to zebrac wszystko wwewnatrz awk i wewnatrz niego wypisac ...
Ostatnio edytowany przez bercik (2009-11-21 23:06:52)
Offline
bercik napisał(-a):
2. przelacznik -q w grepie ma jedna istotna zalete - konczy przeszukiwanie na pierwszej znalezionej linii
Co naturalnie można osiągnąć w każdej sytuacji (-m 1). Ale
grep -m 1 fraza plik.txt >/dev/null 2>&1
jest jeszcze mniej KISS.
Ostatnio edytowany przez azhag (2009-11-22 00:20:21)
Offline
bercik:
1. Przyjęte. Siłą rzeczy go ten błąd nie dotyczy. Poza tym pisałem o „zdecydowanej większości” a nie wszystkich.
2. azhag mnie wyręczył.
3. Z braku kompetencji pozostawiam bez komentarza. Z pewnością można spojrzeć na to z perspektywy wydajności na bardzo dużych plikach i artykuł mógłby wyglądać trochę inaczej. Mogę co najwyżej napisać że jeżeli ktoś operuje na bardzo dużych plikach, pisze skrypty z myślą o wydajności oraz wie że można to samo zrobić w awk, to i tak dobierze narzędzia stosownie do zadania. Jak tez napisałem we wstępie — to tylko zalecenia a nie żelazne reguły których należy przestrzegać zawsze i wszedzie.
4. Jw. Oczywiście masz rację, otoczenie w cudzysłowie zmiennej która będzie argumentem dla for przyniesie skutek odwrotny od oczekiwanego.
6. To tylko pierwszy przykład który przyszedł mi do głowy. Nie zastanawiałem się dlaczego ktokolwiek może potrzebować pliku tymczasowego i nie o tym traktuje artykuł. Ja uznaję, że autor skryptu wie że pliku tymczasowego potrzebuje, i mówię mu jak go stworzyć bez strzelania sobie w stopę.
Generalnie nie ze wszystkimi Twoimi uwagami się zgadzam, ale doceniam je i Twoją wiedzę. Myślę że fajnie by było gdybyś o części z nich napisał także w komentarzu do wpisu — wtedy czytelnicy będą mogli od razu się z nimi zapoznać.
Offline
Ad 3.
azhag@debian:/tmp$ seq 1 100000 > plik.txt # sto tysięcy linii to chyba dostatecznie dużo ;) azhag@debian:/tmp$ wc -l <plik.txt 100000 azhag@debian:/tmp$ time head -10 plik.txt| tail -1 10 real 0m0.008s user 0m0.008s sys 0m0.000s azhag@debian:/tmp$ time awk 'NR == 10 {print}' plik.txt 10 real 0m0.118s user 0m0.072s sys 0m0.000s azhag@debian:/tmp$ time sed -n 10p plik.txt 10 real 0m0.064s user 0m0.040s sys 0m0.004s azhag@debian:/tmp$ time head -99999 plik.txt| tail -1 99999 real 0m0.042s user 0m0.008s sys 0m0.016s azhag@debian:/tmp$ time awk 'NR == 99999 {print}' plik.txt 99999 real 0m0.113s user 0m0.064s sys 0m0.004s azhag@debian:/tmp$ time sed -n 99999p plik.txt 99999 real 0m0.096s user 0m0.052s sys 0m0.000s
Jeszcze ciekawostka:
azhag@debian:/tmp$ cat skrypt seq 1 100000 > plik.txt head -10 plik.txt| tail -1 awk 'NR == 10 {print}' plik.txt sed -n 10p plik.txt head -99999 plik.txt| tail -1 awk 'NR == 99999 {print}' plik.txt sed -n 99999p plik.txt azhag@debian:/tmp$ time bash skrypt 10 10 10 99999 99999 99999 real 0m0.616s user 0m0.420s sys 0m0.032s azhag@debian:/tmp$ time zsh skrypt 10 10 10 99999 99999 99999 real 0m0.579s user 0m0.440s sys 0m0.044s azhag@debian:/tmp$ time dash skrypt 10 10 10 99999 99999 99999 real 0m0.552s user 0m0.424s sys 0m0.036s
Ostatnio edytowany przez azhag (2009-11-22 00:30:40)
Offline
jedna uwaga co do LANG=C ... niekiedy zdecydowanie lepszy jest LC_MESSAGES=C ... np. wychwycenie linii o kasowaniu plikow z outputu rsync -v ... (przy LANG=C rozwala sie znaki UTF8 w nazwach plikow)
Offline
bercik: Ale przecież od samego początku było napisane:
Problem w tym, że wyjście someprogram będzie odmienne w zależności od wartości zmiennej $LC_MESSAGES (ewentualnie $LANG), która określa w jakim języku mają być wyświetlane komunikaty.
Offline
Strony: 1