awk 从字符串中提取数字

jia*_*ian 0 awk

有多个相关问题,似乎它们不能用来awk解决问题。

echo "blah foo123bar234blah" | egrep -o '([0-9]+)' 
Run Code Online (Sandbox Code Playgroud)

回报

123
234 
Run Code Online (Sandbox Code Playgroud)

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

返回123 123

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

回报 123bar234 123 4

手册中,在match(string, regexp [, array])部分中,示例是:

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

返回foooo barrrrr.

那么如何使用 awk (相当于grep -o)从字符串中提取多个数字?

Ed *_*ton 5

使用用于多字符 RS 和 RT 的 GNU awk:

$ echo "blah foo123bar234blah" |
    awk -v RS='[0-9]+' '$0=RT'
123
234
Run Code Online (Sandbox Code Playgroud)

使用任何 awk(并保留原始正则表达式而不是否定它,因为只有使用简单的括号表达式才容易,而不是强大的通用方法):

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

或者:

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