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 中,其他为空白。

4

2 回答 2

4

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

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

$ echo 'foo  bar baz' |
    awk -F'[[:space:]][[:space:]][[:space:]]*' '{print $2}'
bar baz
于 2012-07-10T15:56:08.843 回答
3

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

而不是这个:

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

试试这个:

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

似乎对我有用,并解决了我之前使用的解决方案的缺点,'BEGIN{FS=" "}...该解决方案仅在 2 个空格上拆分。

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

于 2012-07-10T16:04:02.980 回答