Bagaimana cara menggunakan regex sebagai pemisah bidang di awk?

16

Saya mencoba menggunakan regex sebagai pemisah bidang di awk. Dari pembacaan saya ini tampaknya mungkin tetapi saya tidak bisa mendapatkan sintaks yang benar.

rpm -qa | awk '{ 'FS == [0-9]' ; print $1 }'
awk: cmd. line:1: { FS
awk: cmd. line:1:     ^ unexpected newline or end of string

Pikiran? Tujuannya jika tidak diabaikan adalah untuk mendapatkan daftar perangkat lunak tanpa nomor versi.

Ras abu-abu
sumber

Jawaban:

25

Anda telah mengacaukan kutipan dan sintaksis Anda. Untuk mengatur pemisah bidang input, cara termudah untuk melakukannya adalah dengan -Fopsi pada baris perintah:

awk -F '[0-9]' '{ print $1 }'

atau

awk -F '[[:digit:]]' '{ print $1 }'

Ini akan menggunakan digit apa pun sebagai pemisah bidang input, dan kemudian menampilkan bidang pertama dari setiap baris.

The [0-9]dan [[:digit:]]ekspresi tidak cukup sama, tergantung pada lokasi Anda. Lihat " Perbedaan antara [0-9], [[: digit:]] dan \ d ".

Satu juga bisa diatur FSdalam awkprogram itu sendiri. Ini biasanya dilakukan dalam satu BEGINblok karena ini merupakan inisialisasi satu kali:

awk 'BEGIN { FS = "[0-9]" } { print $1 }'

Perhatikan bahwa tanda kutip tunggal tidak dapat digunakan dalam string tanda kutip tunggal dalam shell, dan awkstring selalu menggunakan tanda kutip ganda.

Kusalananda
sumber
12

+1 untuk jawaban Kusalananda. Sebagai alternatif, variabel FS dapat diatur di blok BEGIN:

awk 'BEGIN {FS="[0-9]"} {print $1}'

Mengubah FS di blok tindakan tidak akan berlaku sampai baris berikutnya dibaca

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk '{FS="[0-9]"; print $1}'
abc123
ghi

Kesalahan lain dalam pertanyaan:

  • tidak dapat menggunakan kutipan tunggal di dalam string yang dikutip tunggal
  • ==adalah operator perbandingan, =adalah untuk penugasan variabel
glenn jackman
sumber
1
"Mengubah FS di blok tindakan tidak akan berlaku sampai baris berikutnya dibaca" Saya sudah mencari-cari info itu.
Samizdis
1
plus: tidak dapat menggunakan tanda kutip tunggal untuk nilai string dalam awk, bahkan jika Anda meneruskannya dari shell dengan benar
dave_thompson_085