Skocz do zawartości

Problem W Awku


gtsla86

Rekomendowane odpowiedzi

Witam. Jestem tu nowy więc z góry przepraszam za jakiekolwiek błędu w moich ambitnych pytaniach do forumowiczów. Mam pewien problem z zadaniami których treści są następujące:

 

1. Napisać w awk generator haseł losowych.

Skrypt przymuje 0, 1 lub 2 argumenty. Jeśli są podane argumenty, to powinny one być liczbami całkowitymi (w zapisie dziesiętnym).

 

* 2 argumenty: długość w znakach każdego z generowanych haseł i ich liczba

* 1 argument: liczba generowanych haseł, długość domyślna (8 znaków)

* 0 argumentów: generuje 1 hasło domyślnej długości (8)

 

Wynik wywołania: wypisuje na stdout wygenerowane hasła, po 1 na linię. Hasła są (pseudo)losowymi ciągami znaków wybranymi z pewnego alfabetu, podanego w treści skryptu jako wartość napisowa pewnej zmiennej. Alfabet ten składa się z wielkich liter, cyfr i kilku znaków dodatkowych: "+", "-", "=", "?", ale z pominięciem liter "O" i "I" które łatwo pomylić z cyframi "0" i "1".

 

2. Napisać skrypt, posługujący się narzędziami shellowymi oraz ew. AWK, który dla każdego katalogu podanego jako argument na linii poleceń wypisze obok nazwy tego katalogu, liczbę oraz sumaryczny rozmiar w bajtach tych plików zwyczajnych, zawartych w poddrzewie zakorzenionym w danym katalogu, których data ostatniej modyfikacji jest nie dawniejsza niż 7 dni od chwili obecnej.

 

do zadania 2 mam coś takiego:

 

ls -lg | awk '$6 == "Nov" { sum += $5 }
             END { print sum }'

ale w moim wypadku nie wyświetla mi po wpisaniu ls -lg czegoś takiego:

 

-rw-r--r--  1 arnold   user   1933 Nov  7 13:05 Makefile
-rw-r--r--  1 arnold   user  10809 Nov  7 13:03 gawk.h
-rw-r--r--  1 arnold   user    983 Apr 13 12:14 gawk.tab.h
-rw-r--r--  1 arnold   user  31869 Jun 15 12:20 gawk.y
-rw-r--r--  1 arnold   user  22414 Nov  7 13:03 gawk1.c
-rw-r--r--  1 arnold   user  37455 Nov  7 13:03 gawk2.c
-rw-r--r--  1 arnold   user  27511 Dec  9 13:07 gawk3.c
-rw-r--r--  1 arnold   user   7989 Nov  7 13:03 gawk4.c

 

tylko np

 

 -rw-r--r--  1 arnold   user   1933 2009-07-07 Makefile

 

jeśli ktoś jest w stanie mi pomóc w tym temacie czekam na odpowiedź i z góy bardzo mocno dziękuję

Edytowane przez WalDo
dodanie właściwych znaczników
Odnośnik do komentarza
Udostępnij na innych stronach

Tak ogólnie → http://rtfm.killfile.pl/#praca_domowa

 

Co do tematów, które starałeś się rozwiązać samodzielnie i pokazałeś, że dokonałeś minimalnego wkładu własnego:

[...] nie wyświetla mi po wpisaniu ls -lg czegoś takiego:
No, to może w aktualnym katalogu jest tylko Makefile?

 

Wiesz do czego służy opcja "-g"? Jeśli nie to przeczytaj "man ls" albo po prostu porównaj wyniki wyświetlenia. Będziesz wiedział, że warunek $6 == "Nov" jest bez sensu przy tym co chcesz zrobić. Aczkolwiek dziwne jest, że z wykorzystaniem "-lg" dostajesz wynik w rodzaju

-rw-r--r-- 1 arnold user 1933 Nov 7 13:05 Makefile
Jakiego systemu i w jakiej wersji (również językowej) używasz? Podaj wynik poleceń
uname -a
locale

Z jakiego shella korzystasz? BTW skrypty wypada zaczynać od określenia powłoki w jakiej skrypt ma być wykonany np.

#!/bin/bash

I jeszcze uwaga "redakcyjna" - kody umieszczaj między znacznikami [code][/code] (takie do 15 linijek) albo między [codebox][/codebox] jeśli coś dłuższego.

Odnośnik do komentarza
Udostępnij na innych stronach

skrypt ma być jedno linijkowy taki wstukiwany do terminala, mam narazie komende sumującą w awku:

 

 ls -lg | exec awk '{ sum += $4} END {print sum}'

 

komenda która znajdzie pliki w bieżącym katalogu które były modyfikowane w ciągu ostatnich dwóch dni:

find . -mtime -2

 

jak wstukuje coś takiego to nie śmiga mi całość:

find . -mtime -2 | ls -lg | exec awk '{ sum += $4} END {print sum}'

 

nie wiem gdzie błąd połeniam

Odnośnik do komentarza
Udostępnij na innych stronach

nie wiem gdzie błąd połeniam
Po pierwsze nie "s -lg" tylko "ls -lg".

Po drugie (chociaż to w sumie ważniejsze) po jakiego diabła korzystasz z "ls" i "find" jednocześnie? Przeczytaj sobie takie fajne coś: "man find". Odszukaj opcję "-exec" i wykorzystaj ją z poleceniem "ls -lg". I dopiero wyjście tak skonstruowanego find'a przekieruj na wejście tego awk'a.

Dodałbym jeszcze "-type f", bo w innym wypadku na wyjściu pokazuje się błąd, gdyż find znajduje również katalog bieżący (czyli .)

 

Odnośnik do komentarza
Udostępnij na innych stronach

Oj ta komenda ma mieć opcje najpierw właśnie find, później ls i na koniec awka bez żadnego upiększania. Drogi forumowiczu WalDo widzę że masz ogromną wiedzę w tych sprawach ale nie musisz mi w bardzo intelektualny sposób dogryzać na temat nikłej mej znajomości działania pojęć linuksowych. Ja tylko grzecznie poprosiłem o pomoc za co też z góry dziękuję. Drugiego zadania nie umiem nawet ruszyć.

 

Odnośnik do komentarza
Udostępnij na innych stronach

[...] nie musisz mi w bardzo intelektualny sposób dogryzać [...]
Chyba jesteś przewrażliwiony, bo akurat tutaj w żadnym miejscu nie próbowałem nawet być uszczypliwym.

 

Wracając do tematu: chcesz powiedzieć, że musisz użyć dokładnie tych poleceń i przekierowania strumienia z jednego z nich do następnego? Bo ja zrobiłem to czego szukasz również z wykorzystaniem polecenia "find", "ls" i "awk". Tyle że "ls" w pewnym sensie zawarłem w poleceniu "find" (opcja -exec).

 

[EDIT]

Co do zadania nr.1 polecam → zaawansowane skryptowanie w bash'u. Szczególnie rozdział 9. może byc pomocny.

I tym razem jak najbardziej złośliwie dodam, że wystarczy w Googlach poszukać → http://google.com/linux Hasło: "bash programowanie tutorial" albo "bash programowanie manual"

Odnośnik do komentarza
Udostępnij na innych stronach

Przepraszam za wybuch gniewu ale ostatnio chodzę poddenerwowany tak jakoś i mam jeszcze nie miłę skojarzenia z osobami które pomagały mi wcześniej na forum i wykazywały sie przy tym ogromną wiedzą ale przekaz jej był na zasadzie: "ja jestem Bogiem a ty jesteś śmieciem więc ucz się jak na śmiecia przypadło". Sądzę że mój problem został już rozwiązany. Bardzo dziękuję za pomoc wszystkim.

Odnośnik do komentarza
Udostępnij na innych stronach

"ja jestem Bogiem a ty jesteś śmieciem więc ucz się jak na śmiecia przypadło".
Jeśli o mnie chodzi to Bogiem chwilowo nie jestem, a innych ludzi raczej nie traktuję jak śmieci.

Natomiast zawsze staram się stosować zasadę "wędka a nie ryba". "Rybą" najesz się teraz, ale to "wędka" zapewni dostatek "ryb" w przyszłości. Stąd moje wypowiedzi naprowadzające, ale nie podające jawnie rozwiązania co faktycznie może być denerwujące.

Tak więc jeśli udało ci się dojść do rozwiązania samodzielnie, to gratuluję sukcesu :)

 

@multics jeśli chodzi o zadanie nr.2 doszedłem do "jednolinijkowego" rozwiązania

ls -lg | find . -type f -mtime -2 -exec awk '{ sum += $4} END {print sum}' {} \;

Oczywiście cyfra/liczba przy parametrze "mtime" do modyfikacji zależnie od potrzeb.

Do zadania nr.1 nie podchodziłem. Tak na oko widzę, że największy problem może sprawić algorytm "randomizacji" podanego w skrypcie ciągu znaków możliwych do wykorzystania. Z naciskiem na "algorytm", bo implementacja nie powinna nastręczać trudności.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

Po wpisaniu komendy ls -lg wyświetlane mam następujące elementy:

razem 48
drwx------ 12 greg 4096 2009-05-27 16:21 2sem
-rw-r--r--  1 greg  746 2009-08-12 20:33 hasła.sh
-rw-r--r--  1 greg  753 2009-08-12 20:33 hasła.sh~
drwxr-xr-x  2 greg 4096 2009-07-28 14:48 nowy katalog
drwxr-xr-x  2 greg 4096 2009-07-28 19:57 nowy katalog 2
-rw-r--r--  1 greg   73 2009-08-12 19:42 test2
-rw-r--r--  1 greg   91 2009-08-12 20:10 test3
-rw-r--r--  1 greg   92 2009-08-12 20:09 test3~
-rw-r--r--  1 greg  207 2009-08-12 21:34 test4
-rw-r--r--  1 greg  212 2009-08-12 21:30 test4~
-rw-r--r--  1 greg  299 2009-08-12 19:27 test.sh
-rwxr-xr-x  1 greg  232 2009-06-23 02:03 Zainstaluj aplikacje.desktop

 

Do zadania drugiego z sumowaniem plików których modernizacja nastąpiła w ciągu ostatnich siedmiu dni można łatwo samemu wyliczyć ich całkowitą wielkość dając na to że dzisiaj jst 12.08.2009 wielkość ta wynosi 2473 bajtów. Wpisując polecenie wyszukujące pliki modernizowane 7 dni temu

find . -mtime -7

otrzymuje:

.
./test4
./test3
./test2
./test.sh
./test3~
./hasła.sh~
./hasła.sh
./test4~

a linia poleceń:

find . -mtime -7 | ls -lg | awk '{ sum += $4} END {print sum}'

daje rezultat:

14993

łatwo zauważyć że jest to suma wszystkich plików

natomiast polecenie:

find . -mtime -7 | xargs ls -lg | awk '{ sum += $4} END {print sum}'

daje wartość:

17466. Odjęcie większej od mniejszej daje wartość szukaną w odpowiedzi. Natomiast polecenie:

{code]

ls -lg | find . -type f -mtime -7 -exec awk '{ sum += $4} END {print sum}' {} \;

[/code]

wyświetla:

0
0
0
0
0
0
0
-14

bardzo ciekawy rezultat :)

Zastanawiam się gdzie jest błąd. Czy to ja coś źle zrobiłem czy po prostu któryś z was nie sprawdzał żadnego z tych poleceń. Mam nadzieję że jasno opisałem wszystko co robie po kolei. Nadal nie jest rozwiązane to zadanko. Co do zadania pierwszego, wykonałem je ale nie za pomocą awka a głównie za pomocą komendy:

< /dev/urandom tr -cd '[:graph:]' | fold -w $dlugosc | head -n $liczba

 

Pozdrawiam wszystkich i czekam z niecierpliwością na odpowiedź na temat zadania 2 :)

 

hm, i nikt nadal nie odpowiedział jeszcze :P

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...