Awk

awk 從字元串中提取數字

  • January 18, 2022

有多個相關的問題,似乎它們不能awk用來解決問題。

echo "blah foo123bar234blah" | egrep -o '([0-9]+)' 

返回

123
234 

echo "blah foo123bar234blah" | 
   awk '{ match($0,/([0-9]+)/,m); print m[0], m[1],m[2]}'    

返回123 123

echo "blah foo123bar234blah" | 
   awk '{ match($0,/([0-9]+).+([0-9]+)/,m); print m[0], m[1],m[2]}'    

返回 123bar234 123 4

手冊中的部分:match(string, regexp$$ , array $$),例子是:

echo foooobazbarrrrr |
   gawk '{ match($0, /(fo+).+(bar*)/, arr); print arr[1], arr[2]}'

哪個返回foooo barrrrr

那麼如何使用 awk(相當於grep -o)從字元串中提取多個數字?

使用 GNU awk 進行多字元 RS 和 RT:

$ echo "blah foo123bar234blah" |
   awk -v RS='[0-9]+' '$0=RT'
123
234

使用任何 awk (並保留原始正則表達式而不是否定它,因為這僅通過簡單的括號表達式而不是強大的通用方法很容易):

$ echo "blah foo123bar234blah" |
   awk -v FS='\n' '{gsub(/[0-9]+/,FS"&"FS); for (i=2;i<=NF;i+=2) print $i}'
123
234

或者:

$ echo "blah foo123bar234blah" |
   awk '{ while (match($0,/[0-9]+/) ) {print substr($0,RSTART,RLENGTH); $0=substr($0,RSTART+RLENGTH)} }'
123
234

引用自:https://unix.stackexchange.com/questions/686330