SED AWK从日志文件中删除数据

时间:2015-06-24 15:38:49

标签: bash awk sed cut

您好我在日志文件中有以下条目。 如果我在上面的行中看到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>

此致

2 个答案:

答案 0 :(得分:1)

这个GNU sed可以工作

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

n是跳过打印行
r使用扩展正则表达式,用于在此分组,不转义()字符
N正在读下一行并将其添加到模式中    空间
s /输入/输出/是替换
^是行的开头,所以^。* name =“会找到所有内容直到[^”]第一个下一个引号 $是行尾 [^“]是任何不是”(设置否定)
的字符 \ 1仅采用匹配组,即([^“] *)
p是打印行(当处理2时,prev条件被拒绝已完成)    线

输出

sally
Matt
Linda

答案 1 :(得分:0)

试试这个:

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

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