Saya menemukan beberapa cara untuk mengirimkan variabel shell eksternal ke awk
skrip, tetapi saya bingung tentang '
dan "
.
Pertama, saya mencoba dengan skrip shell:
$ v=123test
$ echo $v
123test
$ echo "$v"
123test
Kemudian mencoba awk:
$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123
Kenapa bedanya?
Terakhir saya mencoba ini:
$ 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
Saya bingung tentang ini.
/var/
. Sebagai gantinya, gunakan tilde:awk -v var="$var" '$0 ~ var'
Jawaban:
Menggunakan
-v
(Cara terbaik, paling portabel)Gunakan
-v
opsi: (PS gunakan spasi setelah-v
atau akan lebih portabel. Misalnya,awk -v var=
tidakawk -vvar=
)Ini harus kompatibel dengan sebagian besar
awk
, dan variabel juga tersedia diBEGIN
blok:Jika Anda memiliki banyak variabel:
Peringatan . Seperti yang ditulis Ed Morton, urutan pelarian akan ditafsirkan sehingga
\t
menjadi nyatatab
dan bukan\t
jika itu yang Anda cari. Dapat diatasi dengan menggunakanENVIRON[]
atau mengaksesnya melaluiARGV[]
PS Jika Anda suka tiga batang vertikal sebagai pemisah
|||
, ia tidak dapat diloloskan, jadi gunakan-F"[|][|][|]"
Variabel setelah blok kode
Di sini kita mendapatkan variabel setelah
awk
kode. Ini akan berfungsi dengan baik selama Anda tidak perlu variabel dalamBEGIN
blok:awk '{print a,b,$0}' a="$var1" b="$var2" file
FS
untuk setiap file.awk 'some code' FS=',' file1.txt FS=';' file2.ext
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):Ini sama dengan:
PS ini memperlakukan variabel sebagai input file.
ENVIRON
memasukkanSaat TrueY menulis, Anda dapat menggunakan
ENVIRON
untuk mencetak Variabel Lingkungan . Mengatur variabel sebelum menjalankan AWK, Anda dapat mencetaknya seperti ini:ARGV
memasukkanSeperti yang ditulis Steven Penny, Anda dapat menggunakan
ARGV
untuk membuat data menjadi awk:Untuk mendapatkan data ke dalam kode itu sendiri, bukan hanya BEGIN:
Variabel dalam kode: GUNAKAN DENGAN HATI-HATI
Anda dapat menggunakan variabel dalam
awk
kode, tetapi berantakan dan sulit dibaca, dan seperti yangCharles Duffy
ditunjukkan, versi ini juga bisa menjadi korban injeksi kode. Jika seseorang menambahkan hal-hal buruk ke variabel, itu akan dieksekusi sebagai bagian dariawk
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.Berikut adalah contoh injeksi kode:
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:
Kesalahan lain yang bisa Anda dapatkan tanpa penawaran ganda:
Dan dengan kutipan tunggal, itu tidak memperluas nilai variabel:
Info selengkapnya tentang AWK dan variabel
Baca faq ini .
sumber
awk -v repo="$1" -v tag="$2" 'BEGIN {print "repo="repo,"tag="tag}'
. Ini akan melihat apakah ia mencetak variabel. Posting pertanyaan sendiri jika Anda tidak bisa mengetahuinya.Tampaknya baik-tua
ENVIRON
awkbuilt-in hash tidak disebutkan sama sekali. Contoh penggunaannya:sumber
-v
tidak berfungsi saat nilainya berisi garis miring terbalik.awk -v x='\c\d' ...
maka akan digunakan dengan benar. Tetapi ketikax
dicetak awk menjatuhkan yang terkenal:awk: warning: escape sequence '\c' treated as plain 'c'
pesan kesalahan ... Terima kasih!-v
dirancang untuk bekerja sehingga Anda dapat menggunakan\t
dalam variabel dan membuatnya cocok dengan tab literal dalam data, misalnya. Jika itu bukan perilaku yang Anda inginkan maka Anda tidak menggunakan yang-v
Anda gunakanARGV[]
atauENVIRON[]
.Gunakan salah satu dari ini tergantung bagaimana Anda ingin garis miring terbalik pada variabel shell yang ditangani (
avar
adalah variabel awk,svar
adalah variabel shell):Lihat http://cfajohnson.com/shell/cus-faq-2.html#Q24 untuk detail dan opsi lainnya. Metode pertama di atas hampir selalu merupakan pilihan terbaik Anda dan memiliki semantik yang paling jelas.
sumber
Anda bisa meneruskan opsi baris perintah
-v
dengan nama variabel (v
) dan nilai (=
) variabel lingkungan ("${v}"
):Atau untuk membuatnya lebih jelas (dengan jauh lebih sedikit
v
):sumber
Anda dapat menggunakan ARGV:
Perhatikan bahwa jika Anda akan melanjutkan ke tubuh, Anda perlu menyesuaikan ARGC:
sumber
Saya baru saja mengubah jawaban @ Jotne untuk "for loop".
sumber
-v
opsi Awk yang telah disebutkan dalam banyak jawaban yang ada. Jika Anda ingin menunjukkan cara menjalankan Awk dalam satu lingkaran, itu pertanyaan yang sangat berbeda.Saya harus memasukkan tanggal di awal baris file log dan dilakukan seperti di bawah ini:
Itu dapat diarahkan ke file lain untuk menyimpan
sumber