Nowe posty

Autor Wątek: Przekazanie parametrów do awk  (Przeczytany 6066 razy)

marcin91

  • Gość
Przekazanie parametrów do awk
« dnia: 2011-10-12, 10:00:03 »
Witam.
Basha poznaję dopiero od paru dni, więc jestem zielony.
W bashu $1 $2 .... to parametry przekazywane do skryptu. W awk $1 $2 ... to Kolejne pola rekordów. Czy w następującym wywołaniu skryptu: nazwa_skryptu tekst1 tekst2
można przekazać parametry $1 i $2 bezpośrednio z wywołania do wbudowanej w awk funkcji gsub, jako jej argumenty tzn: awk '{gsub( $1, $2 ); print}'
Mam nadzieję że opisałem to w miarę sensownie.
Pozdrawiam

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Przekazanie parametrów do awk
« Odpowiedź #1 dnia: 2011-10-12, 10:33:10 »
Tak.

Musisz użyć cudzysłowów " zamiast ' wokół parametru:
awk "{gsub( $1, $2 ); print}"
" pozwala na interpretację,
' oznacza dany tekst dosłowanie
Gdy uzyjesz " i chciałbyś jednak odwołać się do awk-owego parametru, musisz escapować znak $:
awk "{gsub( $1, $2 ); print \\$2}"

marcin91

  • Gość
Przekazanie parametrów do awk
« Odpowiedź #2 dnia: 2011-10-12, 18:40:27 »
Dzięki za odpowiedź, ale jakoś nie przekazuje mi tych parametrów do funkcji.
Ale pewnie ja coś źle rozumiem. Postaram się to wyklarować.
Czy można w wywołaniu skryptu przekazać do basha parametr który jest stringiem?
Jeśli tak, to czy można go później przekazać bezpośrednio do funkcji gsub w awk?
I jeszcze jedno. Jak na początku dodam wzorzec BEGIN{print $2} to drukuje pusty wiersz, a nie parametr wywołania.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Przekazanie parametrów do awk
« Odpowiedź #3 dnia: 2011-10-12, 21:25:14 »
Tak działa:
#!/bin/sh
awk "{ gsub( \\"$1\\", \\"$2\\" ); print }"
Do co przekazywania parametrów łańcuchowych, trzeba pamiętać o cudzysłowach, jeśli pojedynczy parametr ma zawierać spacje:
$ ./test.sh 'cos tam' 'cos innego'
Bez cudzysłowów przekazałbyś 4 parametry zamiast 2.

marcin91

  • Gość
Przekazanie parametrów do awk
« Odpowiedź #4 dnia: 2011-10-12, 21:39:20 »
@ultr - jesteś GOŚĆ. Wielkie dzięki!
Mam nadzieję, że nie będę za bardzo upierdliwy jeśli poproszę Cię o wyjaśnienie składni:
\\"$1\\"
pozdrawiam

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Przekazanie parametrów do awk
« Odpowiedź #5 dnia: 2011-10-13, 01:40:28 »
awk "{ gsub( \\"$1\\", \\"$2\\" ); print }"
Do gsub() chcesz przekazać tekst, więc oba parametry tej funkcji muszą być w cudzysłowie.
A backslash \\ escapuje te cudzysłowy, ponieważ już jeden podwójny cudzysłów mamy otwarty na początku całego parametru dla awk.


Czyli po wydaniu polecenia:
$ ./test.sh 'cos tam' 'cos innego'
linia:
awk "{ gsub( \\"$1\\", \\"$2\\" ); print }"
wykona awk z pojedynczym parametrem równym:
{ gsub( "cos tam", "cos innego" ); print }
Czyli zostaną podstawione parametry $1 i $2 i wyescapowane znaki \\" do ".



Na marginesie: pojedynczego cudzysłowu awk nie przyjmuje (wywala błąd składi):
awk "{ gsub( '$1', '$2' ); print }"     // ŹLE!
.

marcin91

  • Gość
Przekazanie parametrów do awk
« Odpowiedź #6 dnia: 2011-10-13, 13:08:58 »
@ultr, napiszę krótko i treściwie:
Gdyby można było przesyłać browca online, to właśnie teraz na twoim biurku prężyłyby się 3 zimne butelki pełne bursztynowego balsamu. A zebrana wokół ciebie gawiedź, spoglądałaby na te ślicznotki, śliniąc się jak obcy ze statku Nostromo. No..., rozmarzyłem się na samą myśl.
Jeszcze raz dzięki.