Dlaczego awk drukuje całą linię, kiedy chcę, aby wypisała zmienną?

24

Kiedy piszę:

echo "foo bar" | gawk -v var="content" '{print $var}'

Oczekuję, że wynik będzie content. Dlaczego jest to foo bar?

nicoco
źródło
8
Spróbuj usunąć $z $ var
taliezin
W rzeczy samej. Mylę się ze składnią bash ...
nicoco
To dobre pytanie i choć odpowiedź pokazuje, że $został zgubiony, nie jestem pewien, czy powinien zostać zamknięty jako literówka. Ostatnio widziałem kilka z nich, więc być może potrzebujemy kanonicznego
roaima,

Odpowiedzi:

45

Zmienne są przywoływane przez nazwę jak w var, a nie $varw awk. $nodnosi się do pola nth : dla pierwszego pola, dla drugiego ... lub całego rekordu dla == 0 ( to pełny rekord).$1$2n$0

To nie muszą być dosłowne liczby. Możesz użyć $(1+1)lub $variable. Jeśli variablezawiera 1, $variablebędzie to pierwsze pole. Często używane jest $NFdla ostatniego pola ( NFjest to specjalna zmienna, która zawiera liczbę pól).

Jeśli, jak w twoim przykładzie, zmienna nie zawiera liczby, ta liczba jest rozumiana jako 0.

Tak więc var="content"; print $varjest to samo var=0; print $var, a więc to samo print $0, co wydrukować cały rekord.

Tutaj chcesz:

echo "foo bar" | gawk -v var="content" '{print var}'
Stéphane Chazelas
źródło