Awk:只分裂2个或更多空格

时间:2012-07-10 15:49:11

标签: regex unix awk

我正在尝试重新格式化last命令的输出,例如last -adn 10 | head -n -2 | awk -F' {2,}' '{ print "USER:",$1,"IP:",$5 }'

>> last -adn 10 | head -n -2
root     pts/0        Tue Jul 10 13:51   still logged in    10.102.11.34
reboot   system boot  Fri Jun 22 09:37         (18+04:19)   0.0.0.0

我希望我的输出类似于:

>>last -adn 10 | head -n -2 | awk -F' {2,}' '{ print "USER:",$1,"IP:",$5 }'
USER: root IP: 10.102.11.34 TIME: Tue Jul 10 13:51

我已经尝试了here所描述的每一种方法,我无法弄清楚为什么这对我不起作用。 执行该命令时,它只是将整行存储在$ 1中,其他行为空白。

2 个答案:

答案 0 :(得分:4)

默认情况下,gawk不启用间隔表达式。您可以使用--re-interval标志启用它们。其他版本的awk可能会或可能不会支持它们。

如果无法启用该标志,则可以使用更明确的匹配。例如:

$ echo 'foo  bar baz' |
    awk -F'[[:space:]][[:space:]][[:space:]]*' '{print $2}'
bar baz

答案 1 :(得分:2)

更新基于@WilliamPursell评论/建议:

而不是:

awk -F' {2,}' '{ print "USER:",$1,"IP:",$5 }'

试试这个:

awk 'BEGIN{FS="   *"}{ print "USER:",$1,"IP:",$5 }'

似乎对我有用,并使用'BEGIN{FS=" "}...修复了我以前的解决方案的缺点,FS只拆分了2个空格。

注意*设置为 3个空格和{{1}},这意味着最后一个空格可以出现零次或多次。