Przenoszenie zmiennych powłoki do awk
można to zrobić na kilka sposobów. Niektóre są lepsze od innych. Powinno to obejmować większość z nich. Jeśli masz komentarz, zostaw poniżej. wersja 1.5
Korzystanie -v (najlepszy sposób, najbardziej przenośny)
Użyj -vopcji: (PS użyj spacji po -vlub będzie mniej przenośna. Np. awk -v var=Nie awk -vvar=)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
Powinno to być zgodne z większością awk, a zmienna jest również dostępna w BEGINbloku:
Jeśli masz wiele zmiennych:
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
Ostrzeżenie . Jak pisze Ed Morton, sekwencje specjalne będą interpretowane, więc \tstają się rzeczywistością, taba nie, \tjeś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"[|][|][|]"
Przykład pobierania danych z gospody programu / funkcji do awk(tutaj używana jest data)
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
Zmienna po bloku kodu
Tutaj otrzymujemy zmienną po awkkodzie. Będzie to działać dobrze, o ile nie potrzebujesz zmiennej w BEGINbloku:
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
- Dodawanie wielu zmiennych:
awk '{print a,b,$0}' a="$var1" b="$var2" file
- W ten sposób możemy również ustawić inny separator pól
FSdla każdego pliku.
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- Zmienna po bloku kodu nie będzie działać dla
BEGINbloku:
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
Tutaj ciąg
Zmienna może być również dodana do awkkorzystania z ciągu tutaj z powłok, które je obsługują (w tym Bash):
awk '{print $0}' <<< "$variable"
test
To jest to samo co:
printf '%s' "$variable" | awk '{print $0}'
PS traktuje zmienną jako plik wejściowy.
ENVIRON Wejście
Jak pisze TrueY, możesz używać ENVIRONdo drukowania zmiennych środowiskowych . Ustawiając zmienną przed uruchomieniem AWK, możesz wydrukować ją w następujący sposób:
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV Wejście
Jak pisze Steven Penny, możesz użyć, ARGVaby wprowadzić dane do awk:
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
Aby wprowadzić dane do samego kodu, nie tylko POCZĄTEK:
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
Zmienna w kodzie: UŻYWAJ Z ostrożnością
Możesz użyć zmiennej w awkkodzie, ale jest ona nieuporządkowana i trudna do odczytania, a jak Charles Duffyzauważ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ęść awkkodu.
Działa to poprzez wyodrębnienie zmiennej w kodzie, dzięki czemu staje się jej częścią.
Jeśli chcesz, aby awkzmiany zmieniały się dynamicznie przy użyciu zmiennych, możesz to zrobić w ten sposób, ale NIE używaj go do zmiennych normalnych.
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
Oto przykład wstrzyknięcia kodu:
variable='line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
1
2
3
.
.
1000
W awkten 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:
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
Inne błędy, które możesz uzyskać bez podwójnego cytowania:
variable="line one\nline two"
awk -v var=$variable 'BEGIN {print var}'
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ syntax error
I przy pojedynczym cudzysłowie nie rozwija wartości zmiennej:
awk -v var='$variable' 'BEGIN {print var}'
$variable
Więcej informacji o AWK i zmiennych
Przeczytaj to FAQ .