使用awk中的正则表达式打印一行中的所有匹配项

时间:2013-08-28 10:09:06

标签: linux awk

说我有一条线:

终端=“123”Pwd =“567”

我想使用awk

仅选择数字部分
awk 'match($1, /[0-9]+/){print substr($1, RSTART, RLENGTH)};match($2, /[0-9]+/){print   
substr($2, RSTART, RLENGTH)}' file

这给出了期望的结果。

123 567。

但是,必须有其他更好的方法来选择这两个数字而不写两个匹配语句。

感谢。

4 个答案:

答案 0 :(得分:3)

grep对你有用吗?

kent$  echo 'Terminal="123" Pwd="567"'|grep -o '[0-9]\+'
123
567
用awk快速而肮脏:

awk -F'[^0-9]*' '{$1=$1}7'

试验:

kent$  awk -F'[^0-9]*' '{$1=$1}7'<<< 'Terminal="123" Pwd="567"'
 123 567

或:

kent$  awk '{gsub(/[^0-9 ]/,"")}7'<<< 'Terminal="123" Pwd="567"'
123 567

答案 1 :(得分:2)

这是使用awk执行此操作的另一种方法。我们将字段分隔符设置为"

$ echo 'Terminal="123" Pwd="567"' | awk -F\" '{print $2, $4}'
123 567

答案 2 :(得分:2)

这是awk的一个很好的小解决方案:

awk '{gsub("[^0-9]+"," "); print}'

只需将所有连续的非数字字符转换为一个空格,这样就会在数字序列123之前留下一个空格。

答案 3 :(得分:1)

我遇到了类似的问题,但我的模式更复杂,所以我无法用gsub或类似问题来解决我的问题。我写了一个递归函数和一个包装器。它在一个变量中找到多个匹配项,并用空格分隔打印出来:

awk '
    function rec_wrap(str) 
    {
        matches="" 
        return rec_func(str)
    }
    function rec_func(str2)
    {
        where=match(str2, /RE/)
        if(where!=0) {
            matches=(matches substr(str2, RSTART, RLENGTH) " ") 
            rec_func(substr(str2, RSTART+RLENGTH, length(str2)))
        }    
        return matches
    }
    {print rec_wrap($1)}
' file.txt

需要使用包装器rec_wrap清空变量matches。函数match将最左侧匹配的位置和长度写入变量RSTARTRLENGTH,并使用substr提取匹配并将其附加到变量matches。然后函数rec_func调用自身,其余的字符串str2作为参数,直到match找不到匹配为止。