Как получить только первое вхождение в лог-файл, используя awk - PullRequest
0 голосов
/ 03 октября 2019

У меня есть такой файл журнала

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 голосов
/ 03 октября 2019

Еще одно небольшое изменение - просто использовать простую переменную-счетчик, чтобы указать, когда вы находитесь в первом блоке <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) для вывода записи)

0 голосов
/ 03 октября 2019

Первый:

$ 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>
0 голосов
/ 03 октября 2019

Этот 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...