Nowe posty

Autor Wątek: [Bash]: grep i cut  (Przeczytany 8128 razy)

  • Gość
[Bash]: grep i cut
« dnia: 2006-09-27, 17:06:16 »
Witam Serdecznie.

Uczę się bash'a i powoli zgłębiam możliwości takich narzędzi jak grep, cut, sort, diff itd. Nie mniej jednak nie jestem wstanie jeszcze ogarnąć tak obszernego środowiska konsolowego, więc z tegż tytułu chciałbym poprosić Was o pomoc.

Jak sami zauważycie, nie proszę o podawanie rozwiązań konkretnych problemów, aczkolwiek o pokazanie róznych sztuczek, które szybciej pomogą (mnie oraz innym zainteresowanym) opanować zarówno język skryptowy bash'a, jak i obsługę narzędzi wchodzących w standard unix'owy.

Tak więc do rzeczy.

Problemik numer 1  

Stworzyłem sobie pliczek, w którym zawarte są "Nazwa Stacji Telewizyjnej" i jej "Temat Przewodni". Oddzielone są one spacjami":

[command]$ echo "'TVN Sport' Sport 'TVN 24' News 'TVN Lingua' Education 'TVN' Generic 'TVN 7' Generic 'Polsat Sport' Sport Polsat Generic 'Polsat 2' Generic 'Hallmark' Movies 'TVN Style' Entertainment CNN News BBC News Eurosport Sport Edusat Education" >> tv.all

W jaki sposób korzystając z grep lub cut, można wyświetlić wszystkie stacje TVN lub wszystko Sportowe?

Bawiłem się "cat tv.all / cut -d ' ' -f1,2", ale nie zabardzo rozumiem parametry -f i mi się wszystko miesza. W ksiązce natomiast tak daleko nie doszedłem  

Uczę się od niedawna i nie ukrywam, że pomogłaby mi bardzo Wasza odpoweidź. Tylko bardzo proszę o nie pisanie "patrz man", bo to kwestia książek a nie manuali :P A ksiązkę powoli czytam...

Pozdrawiam
Marcel

gomath

  • Gość
[Bash]: grep i cut
« Odpowiedź #1 dnia: 2006-09-27, 19:14:29 »
> Bawiłem się "cat tv.all / cut -d ' ' -f1,2", ale nie zabardzo rozumiem parametry -f i
 > mi się wszystko miesza. W ksiązce natomiast tak daleko nie doszedłem  
 >

Używasz jako separatora spacji, więc na przykład ciąg 'TVN 24' zostanie potraktowany jako dwa ciągi ('TVN i 24') - chyba nie o to Ci hodziło. Mógłbyś użyć innego separatora lub posiłkować się innymi poleceniami bash.

  • Gość
[Bash]: grep i cut
« Odpowiedź #2 dnia: 2006-09-27, 19:44:17 »
No właśnie problemem są seperatory i cydzysłowia które teoretycznie winny łaczyć kilka wyrazów we frazę.

Podałem ten przykład, ponieważ jest on podobny do zadań maturalnych z informatyki. I zastanawia mnie jak można z użyciem tych narzędzi manipulować danymi w plikach.

Ja w tej chwili nie mam żadnych pomysłów na rozwiązanie "zagadki"...

xis

  • Gość
[Bash]: grep i cut
« Odpowiedź #3 dnia: 2006-09-28, 15:20:26 »
2006-09-27 19:44:17 yonami napisał:

> No właśnie problemem są seperatory i cydzysłowia które teoretycznie winny łaczyć kilka wyrazów
 > we frazę.
 >
 > Podałem ten przykład, ponieważ jest on podobny do zadań maturalnych z informatyki. I zastanawia
 > mnie jak można z użyciem tych narzędzi manipulować danymi w plikach.
 >
 > Ja w tej chwili nie mam żadnych pomysłów na rozwiązanie "zagadki"...

Znaki cudzysłowu nie są problemem, bo można je 'obejść' za pomocą sed'a i odpowiedniego wyr. regularnego. Dużo prostsza byłaby sprawa Twojego skryptu, gdybyś każdy wpis o postaci:

miał w osobnej linii, bo wtedy dopiero mógłbyś skorzystać z możliwości grep'a.

  • Gość
[Bash]: grep i cut
« Odpowiedź #4 dnia: 2006-09-28, 15:48:42 »
Chyba tak zrobie, ale problem jest aktualny, bo w takiej formie jednolinijkowej jest na maturze spisane. Na wielu liniach mogę jedynie pouczyć się grepa :D

Dobry pomysł podałeś... Popróbuję wieczorkiem :-)

Dzięki

  • Gość
[Bash]: grep i cut
« Odpowiedź #5 dnia: 2006-09-28, 18:05:30 »

 > W jaki sposób korzystając z grep lub cut, można wyświetlić wszystkie stacje TVN lub wszystko Sportowe?
 
Najlepiej jest zrobic to casem, po podaniu parametru sportowe lub tvn wyswietla konkretny program, mozna rownie zrobic to ifem, co do spacji w teksie wyswietlanym to wystarczy zastosowac w cudzyslowiu apostrof.

a oto skrypcik(robiony szybko na kolanie :P)
#---------------------------------------
#! /bin/bash
TVN="'wszystko_TVN_tvn 24 34 44'"  
SPORTOWE="'sportowe sportowe 3 sportowe 4'"

case "$1" in
TVN) echo "$TVN";;
SPORTOWE) echo "$SPORTOWE";;
*) echo "podaj parametr TVN lub SPOPRTOWE"
exit 1
;;
esac
#-----------------------------------------

Pozdrawiam

  • Gość
[Bash]: grep i cut
« Odpowiedź #6 dnia: 2006-09-29, 01:26:06 »
pionar - nie zrozumiałeś pytania :P

ale i tak dzięki :P