使用sed打印每个匹配模式的第一行

时间:2016-04-18 17:51:17

标签: regex linux awk sed

我想基于一组变量的用户名过滤最后一个实用程序的输出。

这是上次未过滤的样本输出

reboot   system boot  server   Wed Apr  6 13:15 - 14:24  (01:09)    
user1    pts/0        server   Wed Apr  6 13:08 - 13:15  (00:06)    
reboot   system boot  system   Wed Apr  6 13:08 - 13:15  (00:06)    
user1    pts/0        server   Wed Apr  6 13:06 - down   (00:01)    
reboot   system boot  system   Wed Apr  6 13:06 - 13:07  (00:01)    
user1    pts/0        server   Wed Apr  6 12:59 - down   (00:06)  

我想做的是将last的输出传递给sed。然后,使用sed我将打印每个指定用户名的第一次出现,即他们在wtmp中的最后一个日志条目。输出应如此显示,

 reboot   system boot  server   Wed Apr  6 13:15 - 14:24  (01:09)    
 user1    pts/0        server   Wed Apr  6 13:08 - 13:15  (00:06)

我特别喜欢的sed表达式,

last|sed '/user1/{p;q;}'

不幸的是,这只能让我匹配第一次出现的一个用户名。使用这种语法有一种方法可以指定多个用户名吗?提前谢谢!

1 个答案:

答案 0 :(得分:2)

由于awk能够使用关联数组,

awksed更适合这里:

last | awk '!seen[$1]++'

reboot   system boot  server   Wed Apr  6 13:15 - 14:24  (01:09)
user1    pts/0        server   Wed Apr  6 13:08 - 13:15  (00:06)