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/.
Witam,
Pobieram sobię nazwy katalogów domowych użytkowników
ls /home |cut -d ' ' -f1 > lista_katalogow.txt
dane są zapisane do pliku w postaci
jkowalski
ktestowy
rpik
jak odczytać konkretnie jedną linijkę jak nie wiem jak pokazać znak nowej lini.
cat $lista_katalogow.txt |cut -f1 -d' '
pokazuje mi wszystko? będę wdzięczny za pomoc
Redelek
Offline
redelek napisał(-a):
jak odczytać konkretnie jedną linijkę jak nie wiem jak pokazać znak nowej lini.
nie bardzo rozumiem, chcesz wyświetlić konkretny numer linii?
sed -n '{numer_linii}p' PLIK
np.
sed -n '6p' $FILE
Offline
azhag napisał(-a):
redelek napisał(-a):
jak odczytać konkretnie jedną linijkę jak nie wiem jak pokazać znak nowej lini.
nie bardzo rozumiem, chcesz wyświetlić konkretny numer linii?
Kod:
sed -n '{numer_linii}p' PLIKnp.
Kod:
sed -n '6p' $FILE
Dziękuję i przepraszam że dałem to w sieci pomyliłem się.
O tak wygląda mój skrypcik może komuś się przyda
#!/bin/bash plik="kat_dom.txt" kat_users="/home/" dane=`ls $kat_users |cut -d ' ' -f1 > $plik` $dane liczba_lini=`cat $plik |wc -l` for X in `seq $liczba_lini` do LINIA=`cat $plik |head -n $X |tail -n1` home_dir_name=`sed -n ''$X'p' $plik` echo $home_dir_name du -s -h $kat_users$home_dir_name >> poj_dom.txt done rm $plik
Pozdrawiam
Redelek
Offline
Ja tylko pragnę przypomnieć, że użytkownik wcale nie musi mieć katalogu domowego w /home (administrator podczas zakładania konta może wskazać inną lokalizację). Dlatego ścieżki do katalogów domowych użytkowników należy wydobywać z pliku /etc/passwd (acz wypada jeszcze wykluczyć kilku użytkowników systemowych; generalnie przyjęło się, że mają oni UID niższe niż 1000).
A jeżeli chodzi o skrypt:
czadman już podał jednolinijkowca z użyciem find, za chwilę ja podam kilkulinijkowca w shellu. Ale najpierw krytyka:
plik="kat_dom.txt" kat_users="/home/"
Pliki tymczasowe zwykliśmy trzymać w katalogu /tmp.
Dlaczego te nazwę pliku i katalogu przechowujesz w zmiennych, podczas gdy (dalej) poj_dom.txt jest już wpisane na sztywno?
dane=`ls $kat_users |cut -d ' ' -f1 > $plik` $dane
Dlaczego tak? Dlaczego nie po prostu ls ... > $plik? (Pomijając że jak już wolisz w zmiennej, to później powinieneś korzystać z eval).
liczba_lini=`cat $plik |wc -l`
Mnożysz koty. wc -l $plik |awk '{print $1}' (awek/cut jest niezbędny ze względu na format wyjściowy wc).
LINIA=`cat $plik |head -n $X |tail -n1`
Primo: zapomniałeś usunąć tej linii, przez co zmienna $LINIA jest definiowana i nigdy nie używana.
Secundo: ponownie mnożysz koty. head -n $X $plik|tail -n 1
echo $home_dir_name
Ta informacja jest średnio pomocna. Powinieneś raczej wypisywać na terminal coś w stylu „Sprawdzono wielkość katalogu $dir”.
du -s -h $kat_users$home_dir_name >> poj_dom.txt
Kwestia spójności i czytelności kodu: jest to w pętli, a brak wcięcia.
rm $plik
Teraz będzie pochwała: sprzątasz po sobie. To dobrze, bo wiele osób zapomina.
Obiecana implementacja kilkulinijkowa:
for linia in $(cat /etc/passwd |awk -F : '{print $6}'); do if [ -d $linia ] && [ -r $linia ]; then du --si -s $linia >>~/moj_plik.txt fi done
Wykluczanie katalogów użytkowników systemowych (wspomniane wyżej) pozostawiam jako pracę domową (od razu podpowiem, że nie obejdzie się bez gruntownej reorganizacji skryptu).
Offline
Minio napisał(-a):
Kod:
liczba_lini=`cat $plik |wc -l`Mnożysz koty. wc -l $plik |awk '{print $1}' (awek/cut jest niezbędny ze względu na format wyjściowy wc)
w wypadku wc kota bym zostawił w spokoju, potok masz i tak:
cat plik | wc -l wc -l plik | awk '{print $1}'
wręcz awkowy jest bardziej skomplikowany
Minio napisał(-a):
Obiecana implementacja kilkulinijkowa:
Kod:
cat /etc/passwd |awk -F : '{print $6}'
dałbym | grep -v /bin/false | przed awkiem
Ostatnio edytowany przez azhag (2008-08-14 20:49:25)
Offline
azhag napisał(-a):
w wypadku wc kota bym zostawił w spokoju, potok masz i tak:
Potok potokiem, chodzi o ideę nieużywania cat gdy program przyjmuje plik wejściowy jako ostatni argument.
azhag napisał(-a):
wręcz awkowy jest bardziej skomplikowany
Kwestia gustu (i umiejętności).
azhag napisał(-a):
Minio napisał(-a):
Obiecana implementacja kilkulinijkowa:
Kod:
cat /etc/passwd |awk -F : '{print $6}'dałbym | grep -v /bin/false | przed awkiem
grep -v /bin/false /etc/passwd| awk -F : '{print $6}'
Dobre. Ja myślałem o czytaniu linia po linii i sprawdzaniu czy UID jest niższy niż 1000.
Co byłoby równie zgubne jak sprawdzanie samego katalogu /home, gdyż rezerwowanie UID powyżej 1000 jest raczej przyjętym konwenansem niż częścią jakiegokolwiek standardu.
Offline
to może:
awk -F : '{ if( $7 != '/bin/false') system ("/usr/bin/du -hs " $6)}' /etc/passwd
Offline
A dlaczego by nie:
perl -anF: -e 'print `du -hs $F[5]` if ($F[6] !~ m:/bin/false:)' /etc/passwd
76 znaków przeciwko 80 ;) . Kto da mniej?
Btw:
„Czemu to widzisz drzazgę w oku swego brata, a belki we własnym oku nie dostrzegasz?” — tak powinien był mnie ktoś zapytać.
cat /etc/passwd |awk -F : '{print $6}' awk -F : '{print $6}' /etc/passwd
Offline
Minio napisał(-a):
A dlaczego by nie:
Kod:
perl -anF: -e 'print `du -hs $F[5]` if ($F[6] !~ m:/bin/false:)' /etc/passwd76 znaków przeciwko 80 ;) . Kto da mniej?
awk -F : '{if($7!~/false/)system("du -hs "$6)}' /etc/passwd
Offline
Cholera, odchodzę na tarczy.
;)
Offline
mozna jeszcze krocej:
awk -F: '$7!~/false/{system("du -hs "$6)}' /etc/passwd
Offline
A ja się nie zgodzę, bo np. mam wpisy:
ntp:x:123:123:added by portage for ntp:/dev/null:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
Wtedy skrypt się sypie tak jakby trochę ;>
Offline
milyges napisał(-a):
A ja się nie zgodzę, bo np. mam wpisy:
ntp:x:123:123:added by portage for ntp:/dev/null:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
Wtedy skrypt się sypie tak jakby trochę ;>
Wersja nieco poprawiona, przyjmując domyślne ustawienia w debianie dla ludzkich użytkowników.
awk -F: '$7!~/false/&&$3>=1000&&$3<65534{system("du -hs "$6)}' /etc/passwd
Offline
Jakkolwiek w faftylionie na faftylion jeden przypadków będzie działać, MOŻE w pewnych bardzo specyficznych przypadkach zawieść.
Gdybym miał to zrobić, osobiście wpisałbym na sztywno listę użytkowników, których nie ma brać pod uwagę. Generalnie użytkownicy systemowi nie dodają się sami z siebie, więc takie rozwiązanie jest najmniej podatne na przykre konsekwencje. Chociaż jednolinijkowce są pociągające.
Ale to gdybym miał to zrobić. Bo najpierw poważnie zastanowiłbym się, co chcę osiągnąć.
Offline
http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.2.2
BTW. Nie ma programów pozbawionych błędów, po to wprowadzono obsługę wyjątków, itp.
Offline
Jeżeli postępować zgodnie z tymi wytycznymi, UID powinien być z przedziału 1000-29999 a nie 1000-65533.
Offline
azhag napisał(-a):
Minio napisał(-a):
Kod:
liczba_lini=`cat $plik |wc -l`Mnożysz koty. wc -l $plik |awk '{print $1}' (awek/cut jest niezbędny ze względu na format wyjściowy wc)
w wypadku wc kota bym zostawił w spokoju, potok masz i tak:
przepraszam za odkopywanie trupa, ale premiowana odpowiedź brzmi wc -l <plik
Offline