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 -v
opcji: (PS użyj spacji po -v
lub 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 BEGIN
bloku:
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 \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"[|][|][|]"
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 awk
kodzie. Będzie to działać dobrze, o ile nie potrzebujesz zmiennej w BEGIN
bloku:
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
FS
dla każdego pliku.
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- Zmienna po bloku kodu nie będzie działać dla
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):
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ć ENVIRON
do 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ć, ARGV
aby 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 awk
kodzie, ale jest ona nieuporządkowana i trudna do odczytania, a jak Charles 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.
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 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:
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 .