您好我在日志文件中有以下条目。 如果我在上面的行中看到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>
此致
答案 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
- 查找正则表达式组并仅打印出第三个,它等于数据样本中引号内的名称。