Awk:仅在两个或多个空格上拆分

12

我试图重新格式化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

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


它在我的版本GNU Awk 4.0.1中可以工作。 - Birei
可能是问题所在,目前运行的是3.1.5版本。 - Andrew Nguyen
2个回答

6
根据@WilliamPursell的评论/建议,更新如下:
不要这样做:
awk -F' {2,}' '{ print "USER:",$1,"IP:",$5 }'

试试这个:

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

在我的电脑上似乎可以工作,并且解决了我之前使用 'BEGIN{FS=" "}... 的方法的缺点,该方法只在刚好有2个空格时才能分割。

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


第一个会在两个或更多空格处分割,而第二个则只会在正好两个空格处分割。 - Andrew Nguyen
@AndrewNguyen 哦,好的,谢谢您的反馈。那我就删除我的帖子了。 - Levon
1
@Levon 不要删除,只需将其修改为 -F' *'(这是3个空格和一个星号,但 html 正在吞咽空格) - William Pursell
@WilliamPursell 实际上,为什么不把这个作为一个有效的答案发布呢--毕竟,这是您的(正确/有效)答案 :) - Levon
@WilliamPursell 谢谢..我会为了后世留存而做,并给你应有的荣誉(这实际上是你的功劳)。 - Levon
1
我认为这应该是 FS=" *"(有三个空格 - 答案中当前只有两个); 虽然 FS=" +"(有两个空格)也可以使用。 - zelanix

4

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接