Чтение слова в XML между элементами с помощью команды sed

Я столкнулся с тем же вопросом, когда собирал auditd.logчерез SplunkUniversalForwarder и для расследования в Splunk.

Поскольку @ Том Клино уже упоминал и обсуждал в аргументы auditd execve выглядят как закодированные данные , командная строка выглядит как ASCII в шестнадцатеричной кодировке.

Следовательно, его можно было бы декодировать через

echo "" | xxd -r -p

на удаленном сборщике журналов (, т.е. Splunk )позже (и если xxdбыл установлен сvim).

На мой взгляд, лучшим подходом является предварительная обработка журнала с помощью ausearch -if audit.log -iи сбор его с помощью приложения Splunkrlog.sh.

0
07.07.2020, 23:02
3 ответа

Мне пришлось отредактировать ваш XML, чтобы сделать его хорошо -сформированным документом (добавив элемент <root/>и объявив пространства имен):

<?xml version="1.0"?>
<root xmlns:ns1="urn:ns1" xmlns:ns2="urn:ns2" xmlns:ns3="urn:ns3" xmlns:ns4="urn:ns4" xmlns:ns5="urn:ns5" xmlns:nd6="urn:nd6">
  <ns1:account>
    <ns2:name>Corporation</ns2:name>
    <address>
      <StrtNm>NewYork</StrtNm>
      <BldgNb>3</BldgNb>
      <PstCd>230300</PstCd>
      <Ctry>USA</Ctry>
    </address>
  </ns1:account>
  <ns3:details>
    <ns4:accnum>
      <ns5:info>
        <nd6:accnum>1234567</nd6:accnum>
      </ns5:info>
    </ns4:accnum>
  </ns3:details>
</root>

Сделав это, я могу использовать xmlstarletдля разбора файла XML и извлечения именно того элемента, который вам нужен

xmlstarlet sel -t -v '//nd6:accnum' -n x.xml
1234567

При необходимости XPath можно изменить, сделав его более точным. Например /root/ns3:details/ns4:accnum/ns5:info/nd6:accnumбудет крайним вариантом.

Если у вас нет xmlstarlet, я настоятельно рекомендую вам установить его. Если система не принадлежит вам, сделайте ее необходимым условием проекта, над которым вы работаете. Попытка разобрать XML-файл с помощью sedи awkбудет работать в краткосрочной -перспективе, но это приведет к техническому долгу в будущем, особенно если у вас мало контроля над точным макетом XML-документа (. пробелы, новые строки, комментарии и т. д. ).

2
18.03.2021, 23:21

Используя xidel и правильный ввод xml (, см. ответ @roaima ), мы можем:

xidel   -se  '//nd6:accnum/text()'  file.xml

где

  • //nd6:accnum/text()- это выражение XPath, предназначенное для --поиска элемента "nd6 :accnum" в любом месте и выбора его текста.
0
18.03.2021, 23:21

Эта команда -liner perl выведет ожидаемый результат:

perl -lne 'print "$1" if /<nd6:accnum>(\w+)</' file.xml
1234567
0
18.03.2021, 23:21

Теги

Похожие вопросы