我正在尝试重新格式化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中,其他行为空白。
答案 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}},这意味着最后一个空格可以出现零次或多次。