Lebih
Bagaimana cara menggunakan shell variabel dalam awk script?
Saya menemukan beberapa cara untuk lulus eksternal shell variabel untuk sebuah awk
script, tapi aku'm bingung tentang '
dan "
.
Pertama, saya mencoba dengan shell script:
$ v=123test
$ echo $v
123test
$ echo "$v"
123test
Kemudian mencoba awk:
$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123
Mengapa perbedaan?
Akhirnya 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
I'm bingung tentang hal ini.
258
7
Menggunakan
-v
(cara terbaik, paling portabel)Gunakan
-v
pilihan: (P. S. menggunakan spasi setelah-v
atau itu akan menjadi kurang portabel. E. g.,awk -v var=
tidakawk -vvar=
)Ini harus kompatibel dengan sebagian besar
awk
, dan variabel yang tersedia diBEGIN
block juga:Jika anda memiliki beberapa variabel:
Peringatan. Sebagai Ed Morton menulis, escape sequences akan diterjemahkan jadi
\t
menjadi nyatatab
dan tidak\t
jika itu adalah apa yang anda cari. Dapat diselesaikan dengan menggunakanENVIRON[]
atau mengaksesnya melaluiARGV[]
PS Jika anda seperti tiga garis vertikal sebagai pemisah
|||
, hal ini dapat't akan melarikan diri, sehingga menggunakan-F"[|][|][|]"
Variabel setelah blok kode
Di sini kita mendapatkan variabel setelah
awk
code. Ini akan bekerja baik-baik saja asalkan anda tidak perlu variabel dalamBEGIN
block:Ini juga bekerja dengan beberapa variabel
awk '{print a,b,$0}' a="$var1" b="$var2" file
Menggunakan variabel dengan cara ini tidak bekerja di
BEGIN
block:Di sini-string
Variabel juga dapat ditambahkan ke
awk
menggunakan [di sini-string][1] dari kerang yang mendukung mereka (termasuk Bash):Tampaknya bahwa baik-tua
LINGKUNGAN
[tag:awk] built-in hash tidak disebutkan sama sekali. Contoh penggunaannya:Menggunakan salah satu dari ini tergantung bagaimana anda ingin garis miring terbalik di shell variabel ditangani (
avar
adalah sebuah awk variabel,svar
adalah variabel shell):Lihat http://cfajohnson.com/shell/cus-faq-2.html#Q24 untuk rincian dan pilihan lainnya. Metode pertama di atas hampir selalu pilihan terbaik anda dan yang paling jelas semantik.
Anda bisa lulus di opsi baris perintah
-v
dengan nama variabel (v
) dan nilai (=
) dari variabel lingkungan ("${v}"
):Atau untuk membuatnya lebih jelas (dengan jauh lebih sedikit `v):
Anda dapat memanfaatkan ARGV:
Perhatikan bahwa jika anda akan terus masuk ke dalam tubuh, anda akan perlu untuk menyesuaikan ARGC:
Saya harus menyisipkan tanggal pada awal baris dari file log dan's dilakukan seperti di bawah ini:
Hal ini dapat mengarahkan ke file lain untuk menyimpan
Aku hanya berubah @Jotne's jawaban untuk "untuk loop".