Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Skrypt pod linuksem w bash i awk

ADI-mistrzu 05 Cze 2011 19:18 3014 11
  • #1 05 Cze 2011 19:18
    ADI-mistrzu
    Poziom 30  

    Witam!

    Muszę napisać skrypt który będzie pobierał podany parametr, sprawdzał jego poprawność i wykonywał określone czynności:

    1. Wyświetla zalogowanych użytkowników w systemie nie powtarzając ich.
    2. Wyświetla listę plików zwykłych oraz prawa dostępu, w następujący sposób:
    <ścieżka dostępu do kalatogu><nazwa pliku><prawa dostępu><liczba dowiązań>
    Sprawdzić czy drugi parametr określa katalog.

    To co mam teraz wygląda tak:

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Nie mam pojęcia jak zrobić aby sprawdzał czy dany użytkownik był już wyświetlony czy nie. Próbowałem jakoś przekazać wynik polecenia who do awk aby później mieć to w tablicy ARGV tak, że pod każdym z jej adresów jest inny wyraz, ale nie wychodziło mi to.

    Co do drugiego (w programie ostatnie pod parametrem -z) to mam problem jak to wyświetlić w takiej kolejności jak jest w poleceniu.
    Na razie zrobił to tak że wyświetla ścieżkę dostępu a potem w liście dalsze dane.
    Druga sprawa to jak sprawdzić że drugi parametr określa katalog?

    0 11
  • Pomocny post
    #2 05 Cze 2011 19:27
    dt1
    Moderator - Komputery Serwis

    Witaj,
    Jeśli chodzi o wyeliminowanie duplikatów to spróbuj:

    Code:
    who | awk '{ print $1 }' | sort | uniq


    Jeśli chcesz, aby wyświetlił bieżącą ścieżkę i za nią nazwę pliku to możesz spróbować tego:

    Code:
    for i in `ls -1`; do echo `pwd`/$i; done


    Uwaga - parametr do ls to cyfra 1, a nie literka małe L.

    0
  • #3 05 Cze 2011 19:47
    ADI-mistrzu
    Poziom 30  

    Hm... uniq nie znałem, a takie proste i poręczne... Dziękuję :wink:

    Co do sprawdzania czy katalog istnieje, to chciałem wyłuskać błąd z komendy cd i czy nastąpił.
    Niestety nie wiem jak owy błąd wyłuskać. Bo jak w inny sposób można by było sprawdzić czy katalog istnieje?

    Co do skryptu, wyświetla ścieżkę, tylko dalej nie wiem za bardzo jak zrobić aby było to wszystko w rzędzie. Bo echo kończy się znakiem nowej linii więc następne rzeczy będą pod spodem.

    0
  • Pomocny post
    #4 05 Cze 2011 20:01
    dt1
    Moderator - Komputery Serwis

    Jeśli chodzi o sprawdzanie to można sprawdzić, czy cd zwróci błąd, o tym nie pomyślałem, ale możesz też spróbować jakoś tak:

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Pierwszy wynik zwróci zero (to jest plik)
    Drugi zwróci jeden (katalog)
    Trzeci zwróci sporo więcej niż jeden (dużo plików)
    Czwarty zwróci zero (brak pliku, błąd przekierowany do /dev/null, nic nie wyświetli)

    Czyli ogólnie jeśli zwróci jeden to można potraktować jako katalog ;)

    Możesz przypisać do zmiennej sprawdzenie, a potem ifem porównać z cyfrą 1:
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Co do echo, jak nie chcesz w słupku to zmień:
    Code:
    for i in `ls -1`; do echo -ne `pwd`/$i" "; done


    A tak ogólnie - nie ma sensu wymyślać koła od nowa, ifem można sprawdzić, czy coś jest katalogiem. Opcja -d jest od tego (ale wolałem kombinować, niż mana czytać) :P

    0
  • #5 05 Cze 2011 21:18
    ADI-mistrzu
    Poziom 30  

    Podobnie zrobiłem :D

    Kod: bash
    Zaloguj się, aby zobaczyć kod

    Co do wypisywania informacji o plikach:
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Coś takiego kombinuję, aby wyświetlić określoną kolumnę z wiersza gdzie znajduje się określony wyraz (czyli nazwa pliku).
    W ten sposób, z racji że nazwy plików się nie powtarzają, będę mógł wyświetlać ich parametry określone.
    Tylko nie wiem jak jeszcze przekazać parametr do porównania.

    0
  • #6 05 Cze 2011 21:49
    dt1
    Moderator - Komputery Serwis

    Jeśli podasz jakiś przykład (co masz -> co chcesz osiągnąć) to będzie mi łatwiej to sobie wyobrazić :)

    0
  • #7 06 Cze 2011 10:16
    WojtasJD
    VIP Zasłużony dla elektroda

    1. Wyświetla zalogowanych użytkowników w systemie nie powtarzając ich.

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    (BTW: zamiast sort | uniq można sort -u)

    2. Wyświetla listę plików zwykłych oraz prawa dostępu[...]

    ls -l + awk wystarczą, jednak w tej postaci co masz teraz to i nie-zwykłe będą wylistowane

    ADI-mistrzu napisał:
    Co do sprawdzania czy katalog istnieje, to chciałem wyłuskać błąd z komendy cd i czy nastąpił.
    Niestety nie wiem jak owy błąd wyłuskać. Bo jak w inny sposób można by było sprawdzić czy katalog istnieje?

    Kod: bash
    Zaloguj się, aby zobaczyć kod

    0
  • #8 12 Cze 2011 21:03
    ADI-mistrzu
    Poziom 30  

    Przez ten tydzień byłem zajęty i nie mogłem się tym zająć, ale teraz chwilę przysiadłem.

    Został tylko problem z wyświetleniem listy plików zwykłych oraz praw dostępu, w następujący sposób:
    <ścieżka dostępu do kalatogu><nazwa pliku><prawa dostępu><liczba dowiązań>

    Da się zrobić w awk aby wyświetlał określony wiersz a nie wszystkie? Wtedy przy jego pomocy i i ls -l można by rozwiązać to zadanie.


    Dodałem jeszcze wykrywanie czy użytkownik jest zalogowany i działa funkcja, ale zwraca coś jeszcze:

    A zwraca:

    Code:
    /root/test[66]: [: ktosiek: unexpected operator/operand
    
    Uzytkownik nie zalogowany!

    Wskazuje na przedostatnią linię w której jest "fi".
    Jeśli usuną kod do wykrywania czy jest zalogowany użytkownik to błąd znika.

    0
  • #9 12 Cze 2011 22:14
    dt1
    Moderator - Komputery Serwis

    -eq służy do porównywania wyrażeń liczbowych.
    Spróbuj zamiast tego:

    Code:
    if [ "$uzytkownik" = "$2" ]

    Powinno działać lepiej.

    Drobna uwaga (również z manuala do komendy uniq): uniq działa na zasadzie porównywania sąsiednich linii, tak więc spodziewa się posortowanej listy. Dla bezpieczeństwa warto awk ... | uniq zamienić na awk ... | sort | uniq.

    0
  • #10 12 Cze 2011 22:19
    ADI-mistrzu
    Poziom 30  

    z jednym = to raczej przyrównanie (chyba ze jest jednak inaczej...), przy == zwraca tą samą dziwną informację.

    0
  • #11 12 Cze 2011 23:54
    dt1
    Moderator - Komputery Serwis

    man test, sekcja sprawdzanie łańcuchów znakowych mówi, że pojedyncze = jest OK. Z resztą odpaliłem testowo Twój skrypt i u mnie działa z pojedynczym =.

    0
  • #12 13 Cze 2011 20:10
    WojtasJD
    VIP Zasłużony dla elektroda

    ADI-mistrzu napisał:
    Da się zrobić w awk aby wyświetlał określony wiersz a nie wszystkie?

    Podstawy awk.
    Wyświetlenie trzeciego wiersza z plik
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    aha, z Twojego kodu np. ten :
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    nie będzie prawidłowo działał dla plików ze spacjami w nazwie...

    0