Mendapatkan variabel shell awk
dapat dilakukan dengan beberapa cara. Beberapa lebih baik dari yang lain. Ini harus mencakup sebagian besar dari mereka. Jika Anda memiliki komentar, silakan tinggalkan di bawah ini. v1.5
Menggunakan -v
(Cara terbaik, paling portabel)
Gunakan -v
opsi: (PS gunakan spasi setelah -v
atau akan lebih portabel. Misalnya, awk -v var=
tidak awk -vvar=
)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
Ini harus kompatibel dengan sebagian besar awk
, dan variabel juga tersedia di BEGIN
blok:
Jika Anda memiliki banyak variabel:
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
Peringatan . Seperti yang ditulis Ed Morton, urutan pelarian akan ditafsirkan sehingga \t
menjadi nyata tab
dan bukan \t
jika itu yang Anda cari. Dapat diatasi dengan menggunakan ENVIRON[]
atau mengaksesnya melaluiARGV[]
PS Jika Anda suka tiga batang vertikal sebagai pemisah |||
, ia tidak dapat diloloskan, jadi gunakan-F"[|][|][|]"
Contoh untuk mendapatkan data dari program / fungsi penginapan ke awk
(tanggal digunakan)
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
Variabel setelah blok kode
Di sini kita mendapatkan variabel setelah awk
kode. Ini akan berfungsi dengan baik selama Anda tidak perlu variabel dalamBEGIN
blok:
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
- Menambahkan beberapa variabel:
awk '{print a,b,$0}' a="$var1" b="$var2" file
- Dengan cara ini kita juga dapat mengatur Pemisah Bidang yang berbeda
FS
untuk setiap file.
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- Variabel setelah blok kode tidak akan berfungsi untuk
BEGIN
blok:
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
Sini-string
Variabel juga dapat ditambahkan untuk awk
menggunakan string di sini dari shell yang mendukungnya (termasuk Bash):
awk '{print $0}' <<< "$variable"
test
Ini sama dengan:
printf '%s' "$variable" | awk '{print $0}'
PS ini memperlakukan variabel sebagai input file.
ENVIRON
memasukkan
Saat TrueY menulis, Anda dapat menggunakan ENVIRON
untuk mencetak Variabel Lingkungan . Mengatur variabel sebelum menjalankan AWK, Anda dapat mencetaknya seperti ini:
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV
memasukkan
Seperti yang ditulis Steven Penny, Anda dapat menggunakan ARGV
untuk membuat data menjadi awk:
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
Untuk mendapatkan data ke dalam kode itu sendiri, bukan hanya BEGIN:
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
Variabel dalam kode: GUNAKAN DENGAN HATI-HATI
Anda dapat menggunakan variabel dalam awk
kode, tetapi berantakan dan sulit dibaca, dan seperti yang Charles Duffy
ditunjukkan, versi ini juga bisa menjadi korban injeksi kode. Jika seseorang menambahkan hal-hal buruk ke variabel, itu akan dieksekusi sebagai bagian dari awk
kode.
Ini berfungsi dengan mengekstraksi variabel dalam kode, sehingga menjadi bagian darinya.
Jika Anda ingin membuat awk
yang berubah secara dinamis dengan menggunakan variabel, Anda dapat melakukannya dengan cara ini, tetapi JANGAN menggunakannya untuk variabel normal.
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
Berikut adalah contoh injeksi kode:
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
Anda dapat menambahkan banyak perintah dengan awk
cara ini. Bahkan membuatnya crash dengan perintah yang tidak valid.
Informasi tambahan:
Penggunaan kutipan ganda
Itu selalu baik untuk menggandakan variabel penawaran. "$variable"
Jika tidak, beberapa baris akan ditambahkan sebagai satu baris panjang.
Contoh:
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
Kesalahan lain yang bisa Anda dapatkan tanpa penawaran ganda:
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
Dan dengan kutipan tunggal, itu tidak memperluas nilai variabel:
awk -v var='$variable' 'BEGIN {print var}'
$variable
Info selengkapnya tentang AWK dan variabel
Baca faq ini .