Làm thế nào để sử dụng regex làm dấu tách trường trong awk?


16

Tôi đang cố gắng sử dụng regex như một bộ tách trường awk. Từ việc đọc của tôi, điều này có vẻ khả thi nhưng tôi không thể hiểu đúng cú pháp.

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

Suy nghĩ? Mục tiêu nếu không phải là obviouse là có được một danh sách các phần mềm không có số phiên bản.

Câu trả lời:


25

Bạn đã viết lên các trích dẫn và cú pháp của bạn. Để đặt dấu tách trường đầu vào, cách dễ nhất để thực hiện là với -Ftùy chọn trên dòng lệnh:

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

hoặc là

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

Điều này sẽ sử dụng bất kỳ chữ số nào làm dấu tách trường đầu vào, và sau đó xuất trường đầu tiên từ mỗi dòng.

Các biểu thức [0-9][[:digit:]]không hoàn toàn giống nhau, tùy thuộc vào ngôn ngữ của bạn. Xem " Sự khác biệt giữa [0-9], [[: chữ số:]] và \ d ".

Người ta cũng có thể thiết lập FStrong awkchính chương trình. Điều này thường được thực hiện trong một BEGINkhối vì nó là khởi tạo một lần:

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

Lưu ý rằng các trích dẫn đơn không thể được sử dụng trong một chuỗi trích dẫn trong trình bao và các awkchuỗi đó luôn sử dụng dấu ngoặc kép.


12

+1 cho câu trả lời của Kusalananda. Cách khác, biến FS có thể được đặt trong khối BEGIN:

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

Thay đổi FS trong khối hành động sẽ không có hiệu lực cho đến khi dòng tiếp theo được đọc

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

Các lỗi khác trong câu hỏi:

  • không thể sử dụng dấu ngoặc đơn trong một chuỗi trích dẫn
  • ==là một toán tử so sánh, =là để gán biến

1
"Thay đổi FS trong khối hành động sẽ không có hiệu lực cho đến khi dòng tiếp theo được đọc" Tôi đã tìm kiếm tất cả thông tin đó.
Samizdis

1
cộng: không thể sử dụng dấu ngoặc đơn cho giá trị chuỗi trong awk, ngay cả khi bạn chuyển chúng từ shell một cách chính xác
dave_thedom_085
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.