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/.


Członek DUG



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






Admin łajza







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' PLIKnp.
sed -n '6p' $FILE
Offline


Członek DUG



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 $plikPozdrawiam
Redelek
Offline





Bicycle repairman




Użyszkodnik
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
doneWykluczanie 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






Admin łajza







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




Użyszkodnik
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





Bicycle repairman






to może:
awk -F : '{ if( $7 != '/bin/false') system ("/usr/bin/du -hs " $6)}' /etc/passwdOffline




Użyszkodnik
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/passwdOffline





Bicycle repairman






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/passwdOffline




Użyszkodnik
Cholera, odchodzę na tarczy.
;)
Offline




Moderator Mamut
mozna jeszcze krocej:
awk -F: '$7!~/false/{system("du -hs "$6)}' /etc/passwdOffline



inż.
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





Bicycle repairman






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/passwdOffline




Użyszkodnik
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





Bicycle repairman






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




Użyszkodnik
Jeżeli postępować zgodnie z tymi wytycznymi, UID powinien być z przedziału 1000-29999 a nie 1000-65533.
Offline





Bicycle repairman






Admin łajza







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