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 Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2008-05-08 22:50:45

  dawideo - Użytkownik

dawideo
Użytkownik
Zarejestrowany: 2007-09-03

[bash] Liczba wierszy w pliku

Jakim poleceniem mogę policzyć liczbę wierszy w pliku tekstowym???
I jeszcze takie pytanko na uboczy do czego służy opcja OPTARG??

Offline

 

#2  2008-05-08 22:56:34

  azhag - Admin łajza

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

Re: [bash] Liczba wierszy w pliku

dawideo napisał(-a):

Jakim poleceniem mogę policzyć liczbę wierszy w pliku tekstowym???

wc -l liczy linie, może być z wejścia przez potok lub podajesz plik jako argument (ale wtedy brzydko podaje razem z nazwą pliku)
w perwersyjny sposób można też za pomocą cat -n plik | tail -1 | awk '{print $1}' ;)

dawideo napisał(-a):

I jeszcze takie pytanko na uboczy do czego służy opcja OPTARG??

poczytaj na uboczu o getopt
tak pokrótce na uboczu napiszę tylko, że służy do obrabiania podanych argumentów dla flag

Ostatnio edytowany przez azhag (2008-05-08 23:18:12)


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

Offline

 

#3  2008-05-13 21:32:27

  dawideo - Użytkownik

dawideo
Użytkownik
Zarejestrowany: 2007-09-03

Re: [bash] Liczba wierszy w pliku

Czy mógłby mi ktoś powiedzieć co mam w tym skrypcie nie tak???

Kod:

if [ $# -eq 0 ]; then
 echo "Skrypt oblicza ilosc lini w pliku tekstowym"
 echo "-inazwapliku"
elif [ $# -gt 3 ]; then
  echo "Nieprawidlowa liczba paramertow"
else
while getopts :i:j: par 
 do
  case $par in
   i) if [ -r $OPTARG ]; then
    echo "W pliku jest: `cat -n $OPTARG | tail -1 | awk '{print $1}'` linii"
    echo "W pliku jest: `wc -w $OPTARG | awk '{print $1}'` slow"
    echo "W pliku jst:  `wc -c $OPTARG | awk '{print $1}'` znakow"
        echo "Plik zajmuje: `ls -il | grep -w $OPTARG | awk '{printf $6}'` bajtów"
                
     fi;; 

  j) lista=$(diff -s "$1" "$2" | grep ident | sed 's/.*\///;s/\ .*//')
    if [ -z "$lista" ]; then
    printf "\n Brak identycznych plików w podanych katalogach\n"
    else
    printf "\n--- Pliki identyczne ---\n"
    printf "\n$lista\n"
    printf "\n------- Koniec -------\n"
    fi
    exit $?;;

  ?) echo "Nieznana opcja."; exit;;
esac
done;
fi

Tzn. Opcja "i" mi działa mam natomiast problem z opcją "j". Np. po wpisaniu:
./skrypt.sh -jetc nowy  ; (gdzie etc i nowy to dwa katalogi w których skrypt ma znaleść dwa takie same pliki)
Wyskakuj błąd

Kod:

 diff: błędna opcja -- j
diff: Napisz `diff --help' żeby dowiedzieć się więcej.

Offline

 

#4  2008-05-13 23:30:19

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [bash] Liczba wierszy w pliku

Kod:

if [ $# -eq 0 ]; then
 echo "Skrypt oblicza ilosc lini w pliku tekstowym"
 echo "-inazwapliku"
elif [ $# -gt 3 ]; then
  echo "Nieprawidlowa liczba paramertow"
else
while getopts :i:j: par 
 do
  case $par in
   i) if [ -r $OPTARG ]; then
    echo "W pliku jest: `cat -n $OPTARG | tail -1 | awk '{print $1}'` linii"
    echo "W pliku jest: `wc -w $OPTARG | awk '{print $1}'` slow"
    echo "W pliku jst:  `wc -c $OPTARG | awk '{print $1}'` znakow"
        echo "Plik zajmuje: `ls -il | grep -w $OPTARG | awk '{printf $6}'` bajtów"
                
     fi;; 

  j) lista=$(diff -s "$1" "$2" | grep ident | sed 's/.*\///;s/\ .*//')
                ^^^^^^^^^^
    if [ -z "$lista" ]; then
    printf "\n Brak identycznych plików w podanych katalogach\n"
    else
    printf "\n--- Pliki identyczne ---\n"
    printf "\n$lista\n"
    printf "\n------- Koniec -------\n"
    fi
    exit $?;;

  ?) echo "Nieznana opcja."; exit;;
esac
done;
fi

Podkreśliłem wadliwy fragment.
Nie chcę wypowiadać się autorytarnie, a w książce sprawdzać mi się nie chce (późno już), ale wynika jakoby getopts nie wpływał na zmienne $1 i $2 (chociaż jestem przekonany, że jest tam mechanizm automatycznego shiftowania...).
Czyli w Twoim przykładzie:
./skrypt.sh -j etc nowy
$0 : ./skrypt.sh
$1 : -j
$2 : etc
$3 : nowy

Sam już widzisz, gdzie jest błąd.

Innym błędem jest korzystanie z optarg i odwoływanie się do elementów polecenia przez zmienne numeryczne. Po to masz $OPTARG żeby tego nie robić. Jak kiedyś chciałem, żeby jeden przełącznik przyjmował dwa argumenty naskrobałem coś takiego (fragment kodu):

Kod:

numery () {
        nr1=$OPTARG 
        for ((i=0 ; i <= $BASH_ARGC; i++ )); do
                if [ ${BASH_ARGV[$i]} == "-l" ]; then
                        nr2=${BASH_ARGV[$((i - 2))]}
                        break
                fi
        done
}


while getopts ":n:l:g:h" flaga; do
        case $flaga in
                l ) numery 2> /dev/null
                         shift ;;
        esac
done

Offline

 

Stopka forum

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