Unix awk命令正则表达式问题

时间:2009-12-04 10:17:17

标签: regex unix awk grep

我有这样的数据:

# data_display  

ab as we hj kl  
12 34 45 83 21  
45 56 98 45 09

我只需要第一列,只需要以数字开头的行。

我现在用:

# data_display | awk '{ print $1 }' | grep "^[0-9]"  

有没有办法更好地优化它,比如在awk中使用正则表达式?

我对awk很新。

感谢。

KK

6 个答案:

答案 0 :(得分:6)

在awk中,正则表达式出现在print语句之前,包括花括号。所以在你的情况下,awk调用将是:

awk '/^[0-9]/ {print $1}'

答案 1 :(得分:2)

您可以直接将grep regexp放在awk命令中:

data_display | awk '/^[0-9]/{ print $1 }'

答案 2 :(得分:1)

您可以使用cut代替awk

$ data_display | grep '^[0-9]' | cut -f 1 -d ' '

答案 3 :(得分:1)

为了更准确,检查实际数字(如果您有像1a这样的数据,这不是数字,但会使用到目前为止给出的解决方案匹配。

$ awk '$1+0==$1' file

awk '$1 ~/^[0-9]+$/' file

答案 4 :(得分:1)

cut -d'' - f1 filename | grep'^ [0-9]'

这应该是最快的。因为awk看起来并将文件分类为记录和字段。

这里我们通过削减第一个字段来最小化grep需要处理的数据量。

答案 5 :(得分:0)

当然可以:

pax> echo 'ab as we hj kl  
12 34 45 83 21  
45 56 98 45 09' | awk '/^[0-9]/ {print $1}'

给你:

12
45

Awk命令由要匹配的实际模式和要运行的命令组成。如果没有模式,则命令将针对所有行运行。