Извлечение значения атрибута из XML

Obviamente, el sistema tiene hambre de RAM en varios momentos, los eventos asesinos de OOM y el uso de intercambio deberían indicarle eso.

Sin embargo, con 16 GB de RAM y ejecutando MythTV+MySQL+Nagios+Apache, pserver, CVS y Dios sabe qué más (solo estoy adivinando cosas de su topsalida )en el mismo servidor que podría ser demasiado para ello. Tanto en RAM como en E/S.

Tampoco sabemos cuántos eventos tiene en ese Nagios, y cómo es su programación. Demasiados eventos en muy poco tiempo, y comenzarán a lanzarse antes de que se completen, y comerán cualquier máquina sin importar cuán poderosa sea. Y probablemente no tendrán tiempo de completar la ronda cuando la máquina comience a agotarse y, de repente, tenga un montón de cheques de Nagios en marcha. Y encima dices que tienes cronjobs...

Pensaría en tener más recursos y ejecutar un par de máquinas y/o VM con todos esos servicios. Una máquina de consumo tampoco resistirá tanta E/S, en algún momento, si está haciendo un trabajo serio, tiene que pasar al grado de servidor.

Obviamente, en algún momento, también debe realizar una gestión de configuración adecuada de Nagios y MySQL/intervención de DBA para administrar sus recursos disponibles.

Cómo organizar todo esto está fuera del alcance de esta respuesta. Tal como dice el viejo adagio, no pongas todos los huevos en la misma canasta.

PD. lea su imagen superior aquí y vea cuánta RAM usa aproximadamente cada proceso (podrían estar usando más intercambio,pero sabes que al menos están usando eso. Haz tus cálculos ). Esa parte superior es un indicador muy crudo de que sus cálculos de RAM están muy por debajo de lo que necesita el sistema.

PS2. Principalmente estoy adivinando cosas, y obviamente no conozco su configuración específica. Toma el texto como una guía de recomendaciones generales.

8
11.07.2019, 23:54
6 ответов

Используйте синтаксический анализатор XML для анализа данных XML. С это просто становится упражнением XPath:

$ branch=$(xmlstarlet sel -t -v '//blah1[@name="andy"]/@branch' file.xml)
$ echo $branch
master
40
27.01.2020, 20:08

Думаю, это работает:

$ grep -i 'name="andy" remote="origin" branch=".*\"' <filename> | awk -F' ' '{print $5}' | sed -E 's/branch=\"(.*)\"/\1/'
master

Часть awkгарантирует, что возвращается только branch="master", часть sedвозвращает то, что находится между двойными кавычками со ссылкой (, \1соответствует части, заключенной в круглые скобки ).

Теперь я знаю, что здесь много людей с гораздо большими знаниями об искусстве awk и sed, так что я готов к некоторой критике:-)

1
27.01.2020, 20:08

Использованиеawk:

awk '/name="andy"/{ for (i=1;i<=NF;i++) { if ($i ~ "branch=") { sub(/branch=/, ""); gsub(/"/, ""); print $i } } }' input

Это найдет строку, содержащую name="andy", а затем просмотрит каждое поле в этой строке. Если поле содержит branch=, мы удалим branch=и все двойные кавычки и напечатаем оставшуюся часть поля.

sub(/branch=/, "")ищет совпадение branch=и заменяет его на""(ничего)

gsub похож, за исключением того, что он заменяет глобально (все вхождения, а не только первое вхождение ).

3
27.01.2020, 20:08

Сgrep:

grep -Pio 'name="andy".*branch="\K[^"]*' file
  • -Pвключить регулярные выражения perl (PCRE)
  • -iигнорировать регистр
  • -oпечатать только совпадающие детали

В регулярном выражении \Kпредставляет собой поиск назад с нулевой шириной -, чтобы сопоставить часть перед \K, но не включать ее в сопоставление.

11
27.01.2020, 20:08

Используйте xmlint для извлечения значения атрибута с помощью XPath:

xmllint --xpath 'string(/blah/blah1[@name="andy"]/@branch)' file.xml

Для обработки XML лучше использовать синтаксический анализатор XML, поскольку порядок атрибутов может измениться и могут быть вставлены разрывы строк, в результате чего атрибуты имени и ветви будут находиться в разных строках файла.

9
27.01.2020, 20:08

Если у вас нет доступа к xmlint или xmlstarlet на вашем компьютере.Убедитесь, что ваш xml преобразован в одну строку, прежде чем использовать grep следующим образом

cat <filename> | tr -d '\n'

теперь вы уверены, что теги не разбиты на отдельные строки

| grep -Eo  "<blah1[>\ ][^<]+name=\"andy\"[^>]+."

вырежет(как в xpath /blah1[@name="andy"])

<blah1 path="er" name="andy" remote="origin" branch="master" tag="true" />

сейчас

| grep  -oP "(?<=branch\=\")[^\"]*"

вернет(как в xpath /@branch)

мастер

все вместе

cat <filename> | tr -d '\n'| grep -Eo  "<blah1[>\ ][^<]+name=\"andy\"[^>]+." | grep  -oP "(?<=branch\=\")[^\"]*"
0
27.01.2020, 20:08

Теги

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