2012-10-21 27 views

Trả lời

5

Trong GNU awk mà muốn được:

$ cat tst.awk 
BEGIN { 
    str = "foo=23" 
    val = gensub(/foo=([0-9]+)/,"\\1","",str) 
    print "foo value is " val 
} 
$ 
$ gawk -f tst.awk 
foo value is 23 

Trong của awk khác mà bạn sẽ cần phải sử dụng [g] sub() và/hoặc kết hợp() và/hoặc substr() tùy thuộc vào những gì khác bạn làm/không muốn kết hợp. Ví dụ:

$ cat tst.awk 
BEGIN { 
    str = "foo=23" 
    val = substr(str,match(str,/foo=[0-9]+/)+length("foo=")) 
    print "foo value is " val 
} 
$ awk -f tst.awk 
foo value is 23 

Bạn sẽ cần một arg ba 'RLENGTH dài ('foo =')' trên substr() gọi nếu mô hình mục tiêu không phải là ở phần cuối của một đường thẳng. Đặt "foo =" một biến nếu bạn muốn và nếu nó có thể chứa RE thì cần thêm một vài bước nữa.

1

Tại sao không chỉ sử dụng sed?

echo 'foo=23' | sed 's/foo=\([0-9]\+\)/foo value is \1/' 

EDIT: Nếu bạn thực sự cần phải sử dụng awk bạn sẽ phải sử dụng sub hoặc gsub. See here.

+0

Cảm ơn, tôi đã không nhận ra sed có thể thực hiện việc này. – gimmeamilk

+1

Chỉ cần lưu ý rằng "+" là ký tự meta ERE và nhiều "sed" s theo mặc định chỉ hỗ trợ BRE. Đối với một giải pháp di động cho tất cả các seds bạn cần sử dụng [0-9] [0-9] * để thay thế. –

4

Cũng với GNU awk, hãy sử dụng match() function và chụp các nhóm dấu ngoặc đơn thành một mảng.

str = "foo=23" 
match(str, /foo=([0-9]+)/, ary) 
print "foo value is " ary[1] 
1

Có thể hơi muộn cho bữa tiệc, nhưng cách xử lý '=' làm dấu tách trường? Làm việc cho tôi!

echo foo=23 | awk -F= '{ print $1 " value is " $2 }' 
Các vấn đề liên quan