[英]SED AWK to strip data from log file
嗨,我在日志文件中包含以下条目。 如果我在上面的行中看到“拒绝”,则需要在名称字段中生成名称列表。 所以我需要得到类似的东西:
莎莉
马特
琳达
您能帮我这个忙吗,如果您能解释该命令,我将不胜感激,以便以后将其用于其他日志。
<!-- 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>
问候
这个GNU sed可以工作
sed -n -r '/Denied:/{N; s/^.*name="([^"]*)".*$/\1/; p}' file
n是跳过打印行
r使用扩展的正则表达式(用于此处分组)不转义()个字符
N正在读取下一行并将其添加到模式空间
s / input / output /是替代
^是行的开始,因此^。* name =“将查找所有内容,直到[^”]第一个下一个引号为止。
$是行尾
[^“]是非”(设置否定)的任何字符
\\ 1仅采用匹配组,即([^“] *)
p是打印行(当在已处理的2行上完全满足“拒绝”条件时)
输出
sally
Matt
Linda
尝试这个:
sed -rn '/Denied/{n;s#(.+)(name="(\w+))"(.+)#\3#p}' < sample.txt
/Denied/
-搜索关键字
{n;
-如果找到,请阅读下一行
s#(.+)(name="(\\w+))"(.+)#\\3#p
查找正则表达式组并仅打印出第三个,它等于数据样本中引号内的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.