如何用awk只提取数字

How to extract only numbers with awk

你好,我有以下输出:

replication complete (rid=969811 lid=969811)

或有时:

no change of listener transaction id for last 0 checks (rid=971489 lid=970863)

现在我想使用 awk 只从 rid 和 lid 中获取数字,以下仅适用于第一个选项

|awk -F'[^0-9]*' '{print -}'

如果您的目标是使用 ridlid 值,则可以使用此 awk

awk -F\(rid=\|lid=\) '{print -}' yourfile

(或)

awk 'BEGIN{FS="(rid=|lid=)"} {print -}' yourfile
$ echo "no change of listener transaction id for last 0 checks (nid=971491 lid=970876)" |
awk -F'[()]' '{gsub(/[^0-9 ]/,"",); print }'
971491 970876

$ echo "no change of listener transaction id for last 0 checks (nid=971491 lid=970876)" |
awk -F'[()= ]' '{print $(NF-3), $(NF-1)}'
971491 970876

$ echo "no change of listener transaction id for last 0 checks (nid=971491 lid=970876)" |
awk -F'[()= ]' '{for (i=1;i<=NF;i++) m[$i]=$(i+1); print m["nid"], m["lid"]}'
971491 970876

$ echo "no change of listener transaction id for last 0 checks (nid=971491 lid=970876)" |
awk '{gsub(/.*\(|[^0-9 ]+|\).*$/,"")}1'
971491 970876

等,等等...适合您的真正取决于您打算对文本做些什么。

嗯,我现在在你的问题中看到你可能想要打印一个数字减去另一个数字而不是像我想的那样打印数字。这是基于上述的一种方法:

$ echo "no change of listener transaction id for last 0 checks (nid=971491 lid70876)" |
awk -F'[()= ]' '{print $(NF-3) - $(NF-1)}'
615

备选方案留作练习!

另一种解决方案,仅适用于 GNU-awk 4 .... Defining Fields by Content in GAWK

echo "no change of listener transaction id for last 0 checks (rid=971489 lid=970863)" | 
gawk -vFPAT='[0-9]+' '{print $(NF-1), $NF}'

你明白了,

971489 970863
echo "replication complete (rid=969811 lid=969811)" |
gawk -vFPAT='[0-9]+' '{print $(NF-1), $NF}'

你明白了,

969811 969811

注意:如果,你想做减法

echo "replication complete (rid=969811 lid=969811)" |
gawk -vFPAT='[0-9]+' '{print $(NF-1)-$NF}'

你明白了,

0
awk -F'=' '{print int()-int()}'

之所以有效,是因为 awk 解析字符串的方式。