grep / sed / awk / считают между двумя строками в файле не целый файл

У меня есть этот файл на моем ноутбуке /etc/dbus-1/system.d/org.freedesktop.thermald.conf:

<?xml version="1.0"?> <!--*-nxml-*-->
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
        "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">

<!--
  This file is part of systemd.

  systemd is free software; you can redistribute it and/or modify it
  under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.
-->

<busconfig>

        <policy user="root">
                <allow own="org.freedesktop.thermald"/>
                <allow send_destination="org.freedesktop.thermald"/>
                <allow receive_sender="org.freedesktop.thermald"/>
        </policy>

        <policy context="default">
                <deny send_destination="org.freedesktop.thermald"/>
                <allow receive_sender="org.freedesktop.thermald"/>
        </policy>

</busconfig>

Я должен знать если:

<allow send_destination="org.freedesktop.thermald"/>

существует, но только если это не находится под root и должен быть под default.

Поиск файла должен только быть между:

    <policy context="default">

и следующая строка, которая содержит:

    </policy>

Я ищу самое изящное (и читаемый) способ сделать это без любой предвзятости к grep, sed, awk или любая другая общая утилита.

Это - часть программы Python, отображающей расширяемый/разборный tkinter treeview DBus. Я захватываю ошибки разрешения на системной шине, которая не может анализироваться. Анализируйте и отклоните, уже успешно захватывают, но захватывают слишком много. Поскольку это - Python json и xmltree модули уже используются и встроенный Python list и dict функции доступны.

0
задан 20 February 2020 в 05:05

2 ответа

Установка xmllint:

apt-get install libxml2-utils

Проверьте, существует ли Ваш путь XML в контексте default:

xmllint --xpath "//busconfig/policy[@context='default']/allow[@send_destination='org.freedesktop.thermald']" /etc/dbus-1/system.d/org.freedesktop.thermald.conf >/dev/null 2>&1 && echo good || echo bad

Проверьте наоборот, если Ваш путь является несуществующим в другом контексте:

! xmllint --xpath "//busconfig/policy[@user='root']/allow[@send_destination='org.freedesktop.thermald']" /etc/dbus-1/system.d/org.freedesktop.thermald.conf >/dev/null 2>&1 && echo good || echo bad
1
ответ дан 20 February 2020 в 22:50

Используя sed, grep и awk (но не все вместе):

sed -n '/<policy context="default">/,/<\/policy>/p' /etc/dbus-1/system.d/org.freedesktop.thermald.conf | grep '<allow send_destination="org.freedesktop.thermald"\/>' || echo "Not Found"

или

awk '/<policy context="default">/,/<\/policy>/' /etc/dbus-1/system.d/org.freedesktop.thermald.conf | grep '<allow send_destination="org.freedesktop.thermald"\/>' || echo "Not Found"

Примеры:

Поиск allow send_destination:

$ sed -n '/<policy context="default">/,/<\/policy>/p' /etc/dbus-1/system.d/org.freedesktop.thermald.conf | grep '<allow send_destination="org.freedesktop.thermald"\/>' || echo "Not Found"
Not Found

Поиск deny send_destination:

$ sed -n '/<policy context="default">/,/<\/policy>/p' /etc/dbus-1/system.d/org.freedesktop.thermald.conf | grep '<deny send_destination="org.freedesktop.thermald"\/>' || echo "Not Found"
                <deny send_destination="org.freedesktop.thermald"/>

awk работы в значительной степени то же как sed:

$ awk '/<policy context="default">/,/<\/policy>/' /etc/dbus-1/system.d/org.freedesktop.thermald.conf | grep '<allow send_destination="org.freedesktop.thermald"\/>' || echo "Not Found"
Not Found

и

$ awk '/<policy context="default">/,/<\/policy>/' /etc/dbus-1/system.d/org.freedesktop.thermald.conf | grep '<deny send_destination="org.freedesktop.thermald"\/>' || echo "Not Found"
                <deny send_destination="org.freedesktop.thermald"/>
1
ответ дан 20 February 2020 в 22:50

Другие вопросы по тегам:

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