0

我试图让 awk 只打印特定信息。当只涉及简单的文本字符串时,我可以做到。但是当我要求搜索和打印以下内容时它不起作用:

/[0-9]*\.[0-9]*\.[0-9]*\.[0-99]*\.[0-999]*/

我正在寻找用点分隔的数字,就像 IP 地址一样。例如:

#.#.#.##.### where #=integer

例如:

这仅打印TEXT并且工作正常。

awk '{for(i=1;i<=NF;i++){ if($i==“TEXT”){print $i} } }' source.txt > result.txt

这应该打印我需要的东西,但不起作用。

awk '{for(i=1;i<=NF;i++){ if($i==“/[0-9]*\.[0-9]*\.[0-9]*\.[0-99]*\.[0-999]*/”){print $i} } }' source.txt > result.txt

这工作正常,但打印整行,而不仅仅是我需要的:

awk -F"\t" '/[0-9]*\.[0-9]*\.[0-9]*\.[0-99]*\.[0-999]*/{ print }' source.txt > result.txt

我究竟做错了什么?

4

2 回答 2

1

你为什么使用像 [0-9]* 这样的正则表达式 - 我的意思是为什么 '*' ?意味着您正在寻找任何数字(包括零)?[0-9] 就足够了。如果您想要多次重复但有限,只需重复: /[0-9].[0-9].[0-9].[0-9][0-9].[0-9][0-9 ][0-9]/ 代表#.#.#.##.###

awk '{for(i=1;i<=NF;i++) \
{ if($i ~ /[0-9]\.[0-9]\.[0-9]\.[0-9][0-9]\.[0-9][0-9][0-9]/){print $i} } }' jfinancas.txt > teste5.txt

使用 gawk (gnu awk),您可以管理正则表达式 [0-9]{3} 中的重复,将完全匹配 3 位数字。

于 2015-12-07T19:24:37.617 回答
1

使用“==”而不是“~”和不必要的引号。

这工作正常:

awk '{for(i=1;i<=NF;i++){ if($i~/[0-9]*\.[0-9]*\.[0-9]*\.[0-99]*\.[0-999]*/){print $i} } }' jfinancas.txt > teste5.txt
于 2015-12-07T18:55:36.783 回答