[BASH] Awk w skrypcie shellowym

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
mazix2
Sędziwy Jeż
Sędziwy Jeż
Posty: 75
Rejestracja: 11 gru 2009, 10:01
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

[BASH] Awk w skrypcie shellowym

Post autor: mazix2 »

Hej, chce sobie stworzyc taki programik (wlasciwie to skrypt), taka mini baze danych. Przykladowo : mam w pliku (txt) np. jakies rekordy: nazwa produktu, cena, ilosc, data (jakas) i chce stworzyc okienkowe menu (z dialoga) pozwalajace uzytkownikowi na szukanie wybranych rzeczy (chce do tego uzyc awk'a). Pytanie moje jest takie: jak mam to zrobic ? Tzn. czy skrypt moj ma miec rozszerzenie *.sh ? A na gorze mam #!/bin/bash normalnie wpisac ? Pytam, bo zrobilem sobie najprostszy programik jaki tylko mozna, i nie działał :/ to pewnie dlatego, ze cos pokrecilem. Wiec tak:

Mam skrypt powiedzmy sklep.sh:

Kod: Zaznacz cały

#!/bin/bash

echo "To plik sklep.txt:"
awk '{print $0}' sklep.txt
i teraz chce go wywolac normalnie ./skrypt.sh i ... nic sie nie dzieje :/

Jak dałes cos bardziej "zaawansowanego" w skrypcie, tzn

Kod: Zaznacz cały

#!/bin/bash

echo "To plik sklep.txt:"
awk /cukier/ '{print $0}' sklep.txt
też nic ... może ktoś wie, co robię źle ? Podejrzewam że coś przy awk'u/wywołaniu/nazwie skryptu (rozszerzniu) skopałem. :( Pozdrawiam i licze na pomoc.
otokan
Sędziwy Jeż
Sędziwy Jeż
Posty: 65
Rejestracja: 11 gru 2008, 11:20
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [BASH] Awk w skrypcie shellowym

Post autor: otokan »

Odnośnie do pierwszego skryptu: Nawet echo nie działa, czy tylko awk się nie odzywa? Wszystko w porządku z plikiem sklep.txt? Nie jest on przypadkiem pusty?

W drugim wywołaniu awka jest błąd. Powinno być:

Kod: Zaznacz cały

 awk TEKST_PROGRAMU PLIK 
czyli

Kod: Zaznacz cały

 awk '/cukier/ {print $0}' PLIK
Rozszerzenie pliku nie ma znaczenia. Ważne żeby nadać mu prawa do wykonywania.
A poza tym to SOA#1

Jak nic się nie rozjaśni to wklej może wynik poleceń

Kod: Zaznacz cały

ls -l sklep.txt
cat sklep.txt
ls -l skrypt.sh
cat skrypt.sh
./skrypt.sh
mazix2
Sędziwy Jeż
Sędziwy Jeż
Posty: 75
Rejestracja: 11 gru 2009, 10:01
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: [BASH] Awk w skrypcie shellowym

Post autor: mazix2 »

Już działa :)

to mój plik sklep.txt:

cukier#2,50#2009-12-11
maka#3,56#2009-12-19
kasza#1,89#2009-12-05
chleb#2,56#2009-06-14

a to sklep.sh

Kod: Zaznacz cały

#!/bin/bash

echo "To plik sklep.txt:"
echo "Podaj, czego szukasz"
read a
awk -F# '/$a/ {print $1,$2}' sklep.txt
Wcześniejsze rzeczy mi już działają - pojawił się jednak problem - jakbym chciał, aby wyszukane zostało to, co użytkownik wpisze ... np. wpisze datę i ja mam wyswietlić liste produktów ważnych do tej daty. Powyższy sposób nie działa, nic nie wyświetla, skrypt po prostu kończy działanie ... a ja chciałem zrobic takie ładne wyszukiwanie, np wg pierwszej litery produktu, wg daty, itd (wpisałem np. cukier). Prawa nadałem - ale co to znaczy SOA#1 ? (Nie spotkałem się z tym nigdy wcześniej, powiedziawszy szczerze, to Ubuntu dopiero od niedawna się uczę :) )

EDIT:
Witam, napisałem sobie jeszcze coś takiego : czy ktos moze mi powiedziec, czmu to nie dziala ? Tzn. w pliku wynikowym nie jest wpisywane to co poda uzytkownik, a jedynie puste linie ...

Kod: Zaznacz cały

dialog --title "DODAJEMY NOWĄ POZYCYCJĘ" \
         --inputbox "Wpisz nazwe towaru \n który chcesz dodać do bazy" 10 40 2>tmp.txt
         odp=$?
         towar=`cat tmp.txt`
            case $odp in
                0)
                   awk 'BEGIN {print towar}' >> plyty.txt ;;
                1) dialog --title "NIC NIE WPISAŁEŚ" \
                   --msgbox "Nic nie wpisales" 5 25;;
                esac
                rm -f tmp.txt ;;
Bees
Piegowaty Guziec
Piegowaty Guziec
Posty: 10
Rejestracja: 16 kwie 2008, 15:06
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma
Kontakt:

Odp: [BASH] Awk w skrypcie shellowym

Post autor: Bees »

Co do pierwszego skryptu to np to zadziała reszty musisz szukać i czytać .

Kod: Zaznacz cały

#!/bin/bash

echo "To plik sklep.txt:"
echo "Podaj, czego szukasz"

read a
awk 'BEGIN {FS="#"} $0~/'''$a'''/ {print $0}' sklep.txt
Pozdrawiam, Bees!
otokan
Sędziwy Jeż
Sędziwy Jeż
Posty: 65
Rejestracja: 11 gru 2008, 11:20
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [BASH] Awk w skrypcie shellowym

Post autor: otokan »

W pierwszym skrypcie problemem jest to, że bash nie zamienia $a na wartość zmiennej a w pojedynczych cudzysłowach. Czyli awk dostaje jako skrypt do wykonania dosłownie to co napisałeś w cudzysłowach. Zauważ też, że w wywołaniu awka używasz $a i $1 i chciałbyś żeby ta notacja raz znaczyła wartość zmiennej bashowej a raz awkowej.

Kolega już Ci podał rozwiązanie. Ja bym napisał coś takiego.

Kod: Zaznacz cały

awk -F# "/$a/ {print \$1,\$2}" sklep.txt
Musisz mieć jednak świadomość, że jeśli zmienna a bedzie zawierała np. znak / to wszystko się sypnie.

W drugim skrypcie poniższy wiersz nie ma sensu.

Kod: Zaznacz cały

awk 'BEGIN {print towar}' >> plyty.txt
towar to zmienna bashowa - awk nic o niej nie wie.
Pomijam fakt, że w tym wypadku można napisać po prostu

Kod: Zaznacz cały

cat tmp.txt >> sklep.txt
mazix2
Sędziwy Jeż
Sędziwy Jeż
Posty: 75
Rejestracja: 11 gru 2009, 10:01
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: [BASH] Awk w skrypcie shellowym

Post autor: mazix2 »

Serdecznie dziekuje za odpowiedzi - z zapisem juz sobie poradzilem - dalem po prostu:

Kod: Zaznacz cały

echo -n "$towar#" >> sklep.txt
. Z wyszukiwaniem nie ma problemu, bo skorzystałem z Waszych podpowiedzi - jedno mnie tylko zastanawia - dlaczego jesli mam np. 'kasza jeczmienna' i wlasnie jej szukam, to czemu nic sie nie wyswietla (a napewno jest ona w pliku) czy to przez spację w nazwie towaru? Troche to dziwne, bo przeciez w wyszukiwaniu separator jest ustalony - F# ?

EDIT:
Heh, i dalej nic.

To mój plik sklep.txt:

Kod: Zaznacz cały

cukier#2,50#2009-12-11
maka#3,56#2009-12-19
kasza#1,89#2009-12-05
chleb#2,56#2009-06-14
kasza jeczmienna#3,00#2009-14-02
A to skrypt sklep.sh po modyfikacjach:

Kod: Zaznacz cały

#!/bin/bash

dialog --title "SKLEPIK" \
--inputbox "Czego szukasz?" 10 40 2>tmp.txt
odp=$?
towar=`cat tmp.txt`
        case $odp in
        0) dialog --title "Szczegoly" \
 --msgbox "`awk 'BEGIN {FS="#"} $0~/'''$towar'''/ {print $1,$2}' sklep.txt`" 10 30;;
        1) dialog --title "Nie szukamy?" \
           --msgbox "Nie kupujesz nic?" 5 25;;
        esac
        rm -f tmp.txt
Jesli wpisze kasza, wszystko jest ok - natomiast jak wpisze kasza jeczmienna, nie wyswietla nic ... Czemu tak sie dzieje ?
otokan
Sędziwy Jeż
Sędziwy Jeż
Posty: 65
Rejestracja: 11 gru 2008, 11:20
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [BASH] Awk w skrypcie shellowym

Post autor: otokan »

Lepiej użyj sposobu wywołania, który podałem w poprzednim poście.
Przy Twoim wywołaniu:

Kod: Zaznacz cały

awk 'BEGIN {FS="#"} $0~/'''$towar'''/ {print $1,$2}' sklep.txt
zamienia się na

Kod: Zaznacz cały

awk 'BEGIN {FS="#"} $0~/'''kasza jeczmienna'''/ {print $1,$2}' sklep.txt
Kolorami zaznaczyłem kolejne argumenty. Dwa pierwsze nie mają zbyt dużo sensu.
mazix2
Sędziwy Jeż
Sędziwy Jeż
Posty: 75
Rejestracja: 11 gru 2009, 10:01
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: [BASH] Awk w skrypcie shellowym

Post autor: mazix2 »

Zrobilem Twoim sposobem, zobacz:

Kod: Zaznacz cały

#!/bin/bash

dialog --title "SKLEPIK" \
--inputbox "Czego szukasz?" 10 40 2>tmp.txt
odp=$?
towar=`cat tmp.txt`
        case $odp in
        0) dialog --title "Szczegoly" \
 --msgbox "`awk -F# "/$towar/ {print \$1,\$2}" sklep.txt`" 10 30;;
        1) dialog --title "Nie szukamy?" \
           --msgbox "Nie kupujesz nic?" 5 25;;
        esac
        rm -f tmp.txt

jednak nadal jest ten sam problem - przy wpisywaniu 'kasza jeczmienna' nie wyswietla sie nic, a do tego jak wpisze sama kasze, to tez sie nic nie wyswietla ... Tego chyba juz nie da sie obejsc :/ :(
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: [BASH] Awk w skrypcie shellowym

Post autor: beluosus »

Poprawiony skrypt (i przy okazji trochę estetyczniej zapisany - przynajmniej jak dla mnie :)):

Kod: Zaznacz cały

#!/bin/bash

dialog --title "SKLEPIK" --inputbox "Czego szukasz?" 10 40 2> tmp.txt
odp=$?
towar=$(<tmp.txt)

case $odp in
    0)
        msg=$(awk -F# '$0~/'"$towar"'/ {print $1,$2}' sklep.txt)
        dialog --title "Szczegoly" --msgbox "$msg" 10 30;;
    1)
        dialog --title "Nie szukamy?" --msgbox "Nie kupujesz nic?" 5 25;;
esac

rm -f tmp.txt
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Awatar użytkownika
Lechu_
Sędziwy Jeż
Sędziwy Jeż
Posty: 57
Rejestracja: 28 paź 2009, 20:58
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64

Odp: [BASH] Awk w skrypcie shellowym

Post autor: Lechu_ »

Nie lepiej będzie napisać skrypt awk/gawk niż się męczyć ze zmiennymi w bash ??
mazix2
Sędziwy Jeż
Sędziwy Jeż
Posty: 75
Rejestracja: 11 gru 2009, 10:01
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: [BASH] Awk w skrypcie shellowym

Post autor: mazix2 »

beluosus pisze:Poprawiony skrypt (i przy okazji trochę estetyczniej zapisany - przynajmniej jak dla mnie :)):

Kod: Zaznacz cały

#!/bin/bash

dialog --title "SKLEPIK" --inputbox "Czego szukasz?" 10 40 2> tmp.txt
odp=$?
towar=$(<tmp.txt)

case $odp in
    0)
        msg=$(awk -F# '$0~/'"$towar"'/ {print $1,$2}' sklep.txt)
        dialog --title "Szczegoly" --msgbox "$msg" 10 30;;
    1)
        dialog --title "Nie szukamy?" --msgbox "Nie kupujesz nic?" 5 25;;
esac

rm -f tmp.txt
Rzeczywiscie, kod duzo ladniejszy :) Tylko mi nie dzialal ... Zrobilem cos takiego:

Kod: Zaznacz cały

!/bin/sh

dialog --title "SKLEPIK" \
--inputbox "Czego szukasz?" 10 40 2>tmp.txt
odp=$?
towar=`cat tmp.txt`
        case $odp in
        0) dialog --title "Szczegoly" \
 --msgbox "`awk -F# '$0~/'"$towar"'/ {print $1,$2}' sklep.txt`" 10 30;;
        1) dialog --title "Nie szukamy?" \
           --msgbox "Nie kupujesz nic?" 5 25;;
        esac
        rm -f tmp.txt
i teraz jest juz ok :) (Przynajmniej na razie) Bo chcialbym jeszcze dodac sortowanie po wybranych prze zuzytkownika polach i zapisywanie takiego wyniku wyszukiwania do pliku :)

EDIT:
Lechu_ pisze:Nie lepiej będzie napisać skrypt awk/gawk niż się męczyć ze zmiennymi w bash ??
Chcialem napisac to w bashu zeby miec okienka dialogowe :) To zawsze ladniej wyglada :)

W razie probelmow z sortowaniem pozwole sobie pisac tutaj, zeby niepotrzbnie nie zakladac nowych tematow :)

EDIT:
Heh, to znów ja :P

Wymyśliłem sobie, ze fajnie by było móc usuwać także niektóre towary ze sklepu ;) W tym celu chcialem uzyc dodatkowo sed'a ale cos nie bardzo mi to wychodzi - niby pomysl jakis mam, ale to chyba nie to. Chcialem, aby to co wpisze uzytkownik zostalo usuniete ze sklepu. Ponizszy skrypt jest nie za bardzo jesli chodzi o kod - ale z dialogiem sobie poradze najwazniejsze jest dla mnie, ze mi nie dziala usuwanie z pliku :(

Kod: Zaznacz cały

#!/bin/bash

echo "Co usunąć?"

read towar

#szukam awk'iem w pliku linii zawierajacych slowo do usuniecia
#zapisuje to co znalezione do zmiennej
msg=$(awk -F# '$0~/'"$towar"'/ {print $1,$2,$3}' sklep.txt)

#z pliku usuwam to co zostalo znalezione przez awk
#zapisuje do zmiennej
zm=$(sed '/$msg/d' sklep.txt)


echo $zm > tmp.txt

awk -F# '{print $1,$2,$3}' tmp.txt > sklep.txt

dialog --title "PO USUNIECIU" \
--msgbox "`awk '{print $1,$2,$3}' sklep.txt`" 10 30

rm -f tmp.txt
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: [BASH] Awk w skrypcie shellowym

Post autor: beluosus »

Może tak? Aczkolwiek bez seda.

Kod: Zaznacz cały

#!/bin/bash

cat sklep.txt
echo -n "Usuń: "
read item
grep -v "^$item#" sklep.txt > sklep.txt.tmp
mv sklep.txt.tmp sklep.txt
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
mazix2
Sędziwy Jeż
Sędziwy Jeż
Posty: 75
Rejestracja: 11 gru 2009, 10:01
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: [BASH] Awk w skrypcie shellowym

Post autor: mazix2 »

Sposób fajny, i działa ! :D Tylko, ze ja chcialem zrobic cos takiego - z oknem menu, ze ktos wybiera, np, ze chce usunac cos o okreslonej cenie i wyszukiwanie odbywa sie tylko wg kolumny 2-giej (tam gdzie jest cena wlasnie), albo wg daty, itd. A i jeszcze jeden problem napotkalem - jak odczulic awk na wielkosc liter ? Czytalem, ze jest IGNORECASE (do wprowadzanych rzeczy przez uzytkownika) ale tez jakos mi nie wychodzi :(

W sumie nie wiem, czy jest dobrym pomyslem wykoanie czegos takiego ? Bo moze to zepsuje mi caly skrypt ... (IGNORCASE) ?
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Amazon [Bot] i 1 gość