上面的Unix grep行和连接

时间:2014-03-06 20:56:44

标签: unix grep

这是我从日志文件输入的示例。

#2014 03 06 11:21:44:028#+1300#
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[UserID= testUser]

我要做的是遍历所有日志条目并在" UserID ="上执行grep命令。然后得到2行以上的行(时间戳)。然后我希望我的输出文件是文件tempLog.txt

中的两个串联
 #2014 03 06 11:21:44:028#+1300# [UserID= testUser]

任何人都可以帮我吗?还是有点新的Unix ......:)

由于 克里斯

更新的虚假数据

#2.#2014 03 06 11:21:29:163#+1300#Info#/System/Security/Audit/Logon#
#xxxxxx (Has white spaces)
Logon failed    | LOGIN.ERROR   | null  |       | Login Method=[default], IP Address=[xx.xx.xxxx], UserID=[testUser], Reason=[Authentication did not succeed.]#

2 个答案:

答案 0 :(得分:4)

试试这行:

grep --group-separator="" -B2 'UserID=' file|awk -v RS="" -F '\n' '{$2=""}7'

试验:

 kent$  cat f
fooba
#2014 03 06 11:21:44:028#+1300#
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[UserID= testUser]
foo

bar
#2014 03 06 11:21:44:028#+1400#
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[UserID= testUser2]

kent$  grep --group-separator="" -B2 'UserID=' f|awk -v RS="" -F '\n' '{$2=""}7'
#2014 03 06 11:21:44:028#+1300#  [UserID= testUser]
#2014 03 06 11:21:44:028#+1400#  [UserID= testUser2]

答案 1 :(得分:1)

awk应该:

awk '/#20/ {f=$0} /\[UserID/ {print f,$0}' file
#2014 03 06 11:21:44:028#+1300# [UserID= testUser]