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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundację Dzieciom „Zdążyć z Pomocą”.
Więcej informacji na dug.net.pl/pomagamy/.

#1 2008-08-14 15:42:44

redelek
Członek DUG
Skąd: Warszawa
Zarejestrowany: 2008-07-17

Problem ze skryptem w bash

Witam,

Pobieram sobię nazwy katalogów domowych użytkowników

Kod:

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.

Kod:

cat $lista_katalogow.txt |cut -f1 -d' '

pokazuje mi wszystko? będę wdzięczny za pomoc

Redelek


Pozdrawiam
Redelek
--------------------------------------------------------
Polecam hosting ViPower https://vipower.pl/panel/aff.php?aff=208, TikTalik https://tiktalik.com/pl/

Offline

 

#2 2008-08-14 15:53:10

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Problem ze skryptem w bash

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' PLIK

np.

Kod:

sed -n '6p' $FILE

Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#3 2008-08-14 16:07:21

redelek
Członek DUG
Skąd: Warszawa
Zarejestrowany: 2008-07-17

Re: Problem ze skryptem w bash

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' PLIK

np.

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

Kod:

#!/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


Pozdrawiam
Redelek
--------------------------------------------------------
Polecam hosting ViPower https://vipower.pl/panel/aff.php?aff=208, TikTalik https://tiktalik.com/pl/

Offline

 

#4 2008-08-14 17:24:14

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: Problem ze skryptem w bash

a może:

Kod:

find /home -type d -maxdepth 1 -exec du -hs {} \;

http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

#5 2008-08-14 20:07:38

Minio
Użyszkodnik
Skąd: Brno, Česko
Zarejestrowany: 2007-12-22
Serwis

Re: Problem ze skryptem w bash

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:

Kod:

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?

Kod:

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

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

Kod:

        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

Kod:

        echo $home_dir_name

Ta informacja jest średnio pomocna. Powinieneś raczej wypisywać na terminal coś w stylu „Sprawdzono wielkość katalogu $dir”.

Kod:

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.

Kod:

rm $plik

Teraz będzie pochwała: sprzątasz po sobie. To dobrze, bo wiele osób zapomina.

Obiecana implementacja kilkulinijkowa:

Kod:

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

 

#6 2008-08-14 20:36:41

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Problem ze skryptem w bash

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:

Kod:

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)


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#7 2008-08-14 20:58:14

Minio
Użyszkodnik
Skąd: Brno, Česko
Zarejestrowany: 2007-12-22
Serwis

Re: Problem ze skryptem w bash

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

 

#8 2008-08-14 21:47:41

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: Problem ze skryptem w bash

to może:

Kod:

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

http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

#9 2008-08-15 20:14:22

Minio
Użyszkodnik
Skąd: Brno, Česko
Zarejestrowany: 2007-12-22
Serwis

Re: Problem ze skryptem w bash

A dlaczego by nie:

Kod:

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

Kod:

cat /etc/passwd |awk -F : '{print $6}'
awk -F : '{print $6}' /etc/passwd

Offline

 

#10 2008-08-16 00:29:00

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: Problem ze skryptem w bash

Minio napisał(-a):

A dlaczego by nie:

Kod:

perl -anF: -e 'print `du -hs $F[5]` if ($F[6] !~ m:/bin/false:)' /etc/passwd

76 znaków przeciwko 80 ;) . Kto da mniej?

Kod:

awk -F : '{if($7!~/false/)system("du -hs "$6)}' /etc/passwd

http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

#11 2008-08-16 18:27:43

Minio
Użyszkodnik
Skąd: Brno, Česko
Zarejestrowany: 2007-12-22
Serwis

Re: Problem ze skryptem w bash

Cholera, odchodzę na tarczy.
;)

Offline

 

#12 2008-08-18 15:54:43

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: Problem ze skryptem w bash

mozna jeszcze krocej:

Kod:

awk -F: '$7!~/false/{system("du -hs "$6)}' /etc/passwd

"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#13 2008-08-18 18:56:46

milyges
inż.
Skąd: Gorlice/Kraków
Zarejestrowany: 2006-04-09
Serwis

Re: Problem ze skryptem w bash

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

 

#14 2008-08-18 19:40:09

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: Problem ze skryptem w bash

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.

Kod:

awk -F: '$7!~/false/&&$3>=1000&&$3<65534{system("du -hs "$6)}' /etc/passwd

http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

#15 2008-08-19 18:44:49

Minio
Użyszkodnik
Skąd: Brno, Česko
Zarejestrowany: 2007-12-22
Serwis

Re: Problem ze skryptem w bash

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

 

#16 2008-08-19 19:35:58

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: Problem ze skryptem w bash

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.


http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

#17 2008-08-19 20:11:59

Minio
Użyszkodnik
Skąd: Brno, Česko
Zarejestrowany: 2007-12-22
Serwis

Re: Problem ze skryptem w bash

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

Offline

 

#18 2008-08-19 20:18:29

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: Problem ze skryptem w bash

Nie znam na pamięć debian policy. :)


http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

#19 2008-12-21 14:46:35

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Problem ze skryptem w bash

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


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)