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

And*_*yen 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
Run Code Online (Sandbox Code Playgroud)

我想我的输出是这样的:

>>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
Run Code Online (Sandbox Code Playgroud)

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

Lev*_*von 6

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

而不是这个:

awk -F' {2,}' '{ print "USER:",$1,"IP:",$5 }'
Run Code Online (Sandbox Code Playgroud)

尝试这个:

awk 'BEGIN{FS="   *"}{ print "USER:",$1,"IP:",$5 }'
Run Code Online (Sandbox Code Playgroud)

似乎对我有用,并修复了我之前的解决方案的缺点,'BEGIN{FS=" "}...该解决方案仅分割为两个空格。

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


Tod*_*obs 4

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

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

$ echo 'foo  bar baz' |
    awk -F'[[:space:]][[:space:]][[:space:]]*' '{print $2}'
bar baz
Run Code Online (Sandbox Code Playgroud)