我有一个这样的日志文件
some text line
other text line
<a>
<b>1</b>
<c>2</c>
</a>
another text line
<a>
<b>1</b>
<c>2</c>
</a>
yet another text line
我只需要获取XML“ a”的第一个匹配项:
<a>
<b>1</b>
<c>2</c>
</a>
我知道
awk '/<a>/,/<\/a>/' file.log
将查找所有出现的事件,我如何才能获得第一次出现的事件? (添加 | head -n1显然是行不通的,因为它只会捕获第一行,而且我不确定“ a”是多长时间,因为awk表达式必须是通用的,因为我五个具有不同“ a”内容的日志文件)
答案 0 :(得分:0)
这个awk:
awk '
match($0,/<a>/) {
$0=substr($0,RSTART)
flag=1
}
match($0,/<\/a/) {
$0=substr($0,1,RSTART+RLENGTH)
print
exit
}
flag' file
可以处理以下形式:
The above awk handles this:
<a><b>1</b><c>2</c></a>
and this:
<a>
<b>1</b>
<c>2</c>
</a>
and also <a>
<b>1</b>
<c>2</c>
</a> this
the end
另一个GNU awk:
$ gawk -v RS="</?a>" '
NR==1 { printf RT }
NR==2 { print $0 RT }
' file
答案 1 :(得分:0)
另一个小变化是仅使用一个简单的计数器变量来指示您何时位于第一个<a>...</a>
块中,输出该块,然后再退出。在您的情况下,请使用n
作为要在第一个代码段中表示的变量,例如
awk -v n=0 '$1=="</a>" {print $1; exit} $1=="<a>" {n=1}; n==1' f.xml
使用/输出示例
使用输入文件f.xml
,您将得到:
$ awk -v n=0 '$1=="</a>" {print $1; exit} $1=="<a>" {n=1}; n==1' f.xml
<a>
<b>1</b>
<c>2</c>
</a>
(注意:,{n=1}
和n==1
规则依赖默认操作(print
)来输出记录)
答案 2 :(得分:0)
第一:
$ awk '/<a>/{f=1} f; /<\/a>/{exit}' file
<a>
<b>1</b>
<c>2</c>
</a>
最后一个:
$ tac file | awk '/<\/a>/{f=1} f; /<a>/{exit}' | tac
<a>
<b>1</b>
<c>2</c>
</a>
第N个:
$ awk -v n=2 '/<a>/{c++} c==n{print; if (/<\/a>/) exit}' file
<a>
<b>1</b>
<c>2</c>
</a>