Znalazłem kilka sposobów przekazywania zewnętrznych zmiennych powłoki do awk
skryptu, ale nie jestem pewien , czy '
i "
.
Najpierw próbowałem ze skryptem powłoki:
$ v=123test
$ echo $v
123test
$ echo "$v"
123test
Następnie spróbowałem awk:
$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123
Skąd ta różnica?
Wreszcie próbowałem tego:
$ awk 'BEGIN{print " '$v' "}'
$ 123test
$ awk 'BEGIN{print ' "$v" '}'
awk: cmd. line:1: BEGIN{print
awk: cmd. line:1: ^ unexpected newline or end of string
Jestem tym zmieszany.
/var/
. Zamiast tego użyj tyldy:awk -v var="$var" '$0 ~ var'
Odpowiedzi:
Korzystanie
-v
(najlepszy sposób, najbardziej przenośny)Użyj
-v
opcji: (PS użyj spacji po-v
lub będzie mniej przenośna. Np.awk -v var=
Nieawk -vvar=
)Powinno to być zgodne z większością
awk
, a zmienna jest również dostępna wBEGIN
bloku:Jeśli masz wiele zmiennych:
Ostrzeżenie . Jak pisze Ed Morton, sekwencje specjalne będą interpretowane, więc
\t
stają się rzeczywistością,tab
a nie,\t
jeśli tego właśnie szukasz. Można rozwiązać za pomocąENVIRON[]
lub uzyskać do niego dostęp za pośrednictwemARGV[]
PS Jeśli podoba Ci się trzy pionowe paski jako separatory
|||
, nie można ich uciec, więc użyj-F"[|][|][|]"
Zmienna po bloku kodu
Tutaj otrzymujemy zmienną po
awk
kodzie. Będzie to działać dobrze, o ile nie potrzebujesz zmiennej wBEGIN
bloku:awk '{print a,b,$0}' a="$var1" b="$var2" file
FS
dla każdego pliku.awk 'some code' FS=',' file1.txt FS=';' file2.ext
BEGIN
bloku:echo "input data" | awk 'BEGIN {print var}' var="${variable}"
Tutaj ciąg
Zmienna może być również dodana do
awk
korzystania z ciągu tutaj z powłok, które je obsługują (w tym Bash):To jest to samo co:
PS traktuje zmienną jako plik wejściowy.
ENVIRON
WejścieJak pisze TrueY, możesz używać
ENVIRON
do drukowania zmiennych środowiskowych . Ustawiając zmienną przed uruchomieniem AWK, możesz wydrukować ją w następujący sposób:ARGV
WejścieJak pisze Steven Penny, możesz użyć,
ARGV
aby wprowadzić dane do awk:Aby wprowadzić dane do samego kodu, nie tylko POCZĄTEK:
Zmienna w kodzie: UŻYWAJ Z ostrożnością
Możesz użyć zmiennej w
awk
kodzie, ale jest ona nieuporządkowana i trudna do odczytania, a jakCharles Duffy
zauważa, ta wersja może również być ofiarą wstrzyknięcia kodu. Jeśli ktoś doda złe elementy do zmiennej, zostanie ona wykonana jako częśćawk
kodu.Działa to poprzez wyodrębnienie zmiennej w kodzie, dzięki czemu staje się jej częścią.
Jeśli chcesz, aby
awk
zmiany zmieniały się dynamicznie przy użyciu zmiennych, możesz to zrobić w ten sposób, ale NIE używaj go do zmiennych normalnych.Oto przykład wstrzyknięcia kodu:
W
awk
ten sposób możesz dodać wiele poleceń . Nawet powoduje awarię przy użyciu niepoprawnych poleceń.Informacje dodatkowe:
Zastosowanie podwójnej wyceny
Zawsze dobrze jest podwoić zmienną,
"$variable"
jeśli nie, wiele wierszy zostanie dodanych jako długa pojedyncza linia.
Przykład:
Inne błędy, które możesz uzyskać bez podwójnego cytowania:
I przy pojedynczym cudzysłowie nie rozwija wartości zmiennej:
Więcej informacji o AWK i zmiennych
Przeczytaj to FAQ .
źródło
awk -v repo="$1" -v tag="$2" 'BEGIN {print "repo="repo,"tag="tag}'
. Zobaczy, czy wypisze zmienną. Napisz własne pytanie, jeśli nie możesz się zorientować.Wygląda na to, że stary dobry
ENVIRON
awkwbudowany skrót nie jest wcale wspomniany. Przykład jego użycia:źródło
-v
nie działa, gdy wartość zawiera ukośniki odwrotne.awk -v x='\c\d' ...
użyję, to użyję go właściwie. Ale pox
wydrukowaniu awk upuszcza słynny:awk: warning: escape sequence '\c' treated as plain 'c'
komunikat o błędzie ... Dzięki!-v
zaprojektowano działanie, aby można było użyć\t
w zmiennej i dopasować ją na przykład dosłowną kartę w danych. Jeśli nie jest to pożądane zachowanie, to nie korzystasz,-v
którego używaszARGV[]
lubENVIRON[]
.Użyj jednego z tych, w zależności od tego, jak chcesz obsługiwać odwrotne ukośniki w zmiennych powłoki (
avar
jest to zmienna awk,svar
jest zmienna powłoki):Zobacz http://cfajohnson.com/shell/cus-faq-2.html#Q24, aby uzyskać szczegółowe informacje i inne opcje. Pierwsza powyższa metoda jest prawie zawsze najlepszą opcją i ma najbardziej oczywistą semantykę.
źródło
Możesz przekazać opcję wiersza polecenia
-v
ze zmienną name (v
) i wartością (=
) zmiennej środowiskowej ("${v}"
):Lub, aby było to jaśniejsze (przy znacznie mniejszej liczbie
v
s):źródło
Możesz skorzystać z ARGV:
Zauważ, że jeśli zamierzasz kontynuować pracę w ciele, musisz dostosować ARGC:
źródło
Właśnie zmieniłem odpowiedź @ Jotne na „for loop”.
źródło
-v
opcji Awk, która była już wspomniana w wielu istniejących odpowiedziach. Jeśli chcesz pokazać, jak uruchomić Awk w pętli, to naprawdę jest inne pytanie.Musiałem wstawić datę na początku wierszy pliku dziennika i zrobiłem to tak, jak poniżej:
Można go przekierować do innego pliku w celu zapisania
źródło