SED AWK 从日志文件中剥离数据

SED AWK to strip data from log file

您好,我在日志文件中有以下条目。 如果我在上面的行中看到 Denied,我需要在名称字段中生成一个名称列表。所以我需要得到类似的东西:

莎莉
马特

琳达

你能帮我解决这个问题吗?如果你能解释一下这个命令,我将不胜感激,这样我以后就可以将它用于其他日志。

<!-- user 1 -- >
<ABC  12345 "123" text="*Denied: ths is aa test status="0" > 
   <key flags="tdst"  name="sally"  />
<userbody>
</Status>

<!-- user 2 -- >
<ABD  12345 "123" text="*Denied: ths is aa test status="0" > 
  <key flags="tdst"  name="Matt"  />
<userbody>
</Status>

<!-- user 3 -- >
<ABD  12345 "123" text="*Denied: ths is aa test status="0" > 
   <key flags="tdst"  name="Linda"  />
<userbody>
</Status>

此致

试试这个:

sed -rn '/Denied/{n;s#(.+)(name="(\w+))"(.+)##p}' < sample.txt

/Denied/ - 搜索关键词
{n; - 如果找到则阅读下一行
s#(.+)(name="(\w+))"(.+)##p - 查找正则表达式组并仅打印出第三个,它等于数据样本中引号内的名称。

这个 GNU sed 可以工作

sed -n -r '/Denied:/{N; s/^.*name="([^"]*)".*$//; p}' file  

n 是跳过打印行
r 使用扩展正则表达式,这里用于分组,不转义()字符
N 正在读取下一行并将其添加到模式 space
s/input/output/是替换
^ 是行首,所以 ^.*name=" 会找到所有内容,直到 [^"] first next quote.
$ 是行尾
[^"] 是任何不是 " 的字符(设置否定)
\1 只接受匹配组,即 ([^"]*)
p 是打印行(当 prev condition Denied 在 processed 2 上被 fullfiled 时 行

输出

sally
Matt
Linda