簡體   English   中英

如何在AWK中將正則表達式用於字段分隔符?

[英]How to use a regex for the field separator in AWK?

我讀了另一個答案 ,顯示了如何使用-F標志設置字段分隔符:

awk -F 'INFORMATION DATA ' '{print $2}' t

現在,我很好奇如何將正則表達式用於字段分隔符。 我的嘗試可以在下面看到:

$ echo "1 2 foo\n2 3 bar\n42 2 baz"
1 2 foo
2 3 bar
42 2 baz
$ echo "1 2 foo\n2 3 bar\n42 2 baz" | awk -F '\d+ \d+ ' '{ print $2 }'
# 3 blank lines

我期望得到以下輸出:

foo
bar
baz 

這是因為我的正則表達式\\d+ \\d+匹配“前兩個數字,中間用空格隔開,后跟一個空格”。 但是我正在打印第二條記錄。 如圖所示上rubular

在此處輸入圖片說明

  • 如何使用正則表達式作為awk字段分隔符?

只需將\\d替換為[0-9]

這樣,您可以打印所有字段,並且可以立即看到這些字段:

$ echo -e "1 2 foo\n2 3 bar\n42 2 baz" |awk -v FS="[0-9]+ [0-9]+" '{for (k=1;k<=NF;k++) print k,$k}'
1 
2  foo
1 
2  bar
1 
2  baz

因此,只需在命令中使用[0-9]:

$ echo -e "1 2 foo\n2 3 bar\n42 2 baz" |awk -v FS="[0-9]+ [0-9]+" '{print $2}'
 foo
 bar
 baz

首先, echo不會自動轉義並輸出文字\\n 因此,您需要添加-e以啟用轉義。 第二, awk不支持\\d因此您必須使用[0-9][[:digit:]]

echo -e "1 2 foo\n2 3 bar\n42 2 baz" | awk -F '[0-9]+ [0-9]+ ' '{ print $2 }'

要么

echo -e "1 2 foo\n2 3 bar\n42 2 baz" | awk -F '[[:digit:]]+ [[:digit:]]+ ' '{ print $2 }'

兩個輸出:

foo
bar
baz 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM