如何使用awk

时间:2019-10-03 15:13:27

标签: awk

我有一个这样的日志文件

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”内容的日志文件)

3 个答案:

答案 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>
相关问题