首页 > 解决方案 > sed 多行打印制表符分隔

问题描述

我想使用sed从命令输出中提取index numberusernameIP addresslast use elapsed time,如下所示:

smb:usersArray:_array_index:5:lastUseElapsedTime = 214
smb:usersArray:_array_index:5:minsToDisconnect = 0
smb:usersArray:_array_index:5:sessionType = "tcp"
smb:usersArray:_array_index:5:serviceType = "smb"
smb:usersArray:_array_index:5:ipAddress = "192.168.168.1"
smb:usersArray:_array_index:5:sessionID = 9188440707059155379
smb:usersArray:_array_index:5:loginElapsedTime = 3897
smb:usersArray:_array_index:5:disconnectID = 9188440707059155379
smb:usersArray:_array_index:5:name = "DOMAIN\username1"
smb:usersArray:_array_index:5:flags = 0
smb:usersArray:_array_index:6:lastUseElapsedTime = 3772
smb:usersArray:_array_index:6:minsToDisconnect = 0
smb:usersArray:_array_index:6:sessionType = "tcp"
smb:usersArray:_array_index:6:serviceType = "smb"
smb:usersArray:_array_index:6:ipAddress = "192.168.168.2"
smb:usersArray:_array_index:6:sessionID = 9188440707059155380
smb:usersArray:_array_index:6:loginElapsedTime = 3783
smb:usersArray:_array_index:6:disconnectID = 9188440707059155380
smb:usersArray:_array_index:6:name = "DOMAIN\username2"
smb:usersArray:_array_index:6:flags = 0

...并打印一个制表符分隔的输出,如下所示:

5<tab>192.168.168.1<tab>username1<tab>214
6<tab>192.168.168.2<tab>username2<tab>3772
....

我怎样才能做到这一点?

标签: sed

解决方案


awk 来救援

awk -F":| = " '{gsub(/"/,"");gsub(/DOMAIN\\/, "")};$5~/ipAddress/{ip[$4]=$6} $5~/name/{name[$4]=$6} $5~/lastUseElapsedTime/{time[$4]=$6} END{for(e in time){print e, ip[e], name[e], time[e]}}' OFS="\t" file

或者通过模拟多维数组:

awk -F":| = " '{gsub(/"/,"");gsub(/DOMAIN\\/, "")}{id[$4]=1;r[$4 $5]=$6}END{for(e in id){print e, r[e "ipAddress"], r[e "name"], r[e "lastUseElapsedTime"]}}' OFS="\t" file

(很想使用这个:https ://www.gnu.org/software/gawk/manual/html_node/Arrays-of-Arrays.html但不适用于我的 awk 版本)

输出 :

5   192.168.168.1   username1   214
6   192.168.168.2   username2   3772

推荐阅读