如何用awk只提取数字

时间:2015-10-05 09:30:23

标签: awk numbers

您好我有以下输出:

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 $2-$3}'

4 个答案:

答案 0 :(得分:1)

$ echo "no change of listener transaction id for last 0 checks (nid=971491 lid=970876)" |
awk -F'[()]' '{gsub(/[^0-9 ]/,"",$2); print $2}'
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

作为练习留下的替代品!

答案 1 :(得分:0)

如果您的目标是使用awkrid值,则可以使用此lid

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

(OR)

awk 'BEGIN{FS="(rid=|lid=)"} {print $2-$3}' yourfile

答案 2 :(得分:0)

另一种解决方案,仅适用于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

答案 3 :(得分:0)

awk -F'=' '{print int($2)-int($3)}'

因为awk解析字符串的方式而工作。