# HG changeset patch # User František Kučera # Date 1577546381 -3600 # Node ID 5cf3a702f47d11e875c2882e4b4aeaafd2ea8915 # Parent 780d782cdef5db5dec795b4b44075aa86d74f406 examples: AWKing through a XML file diff -r 780d782cdef5 -r 5cf3a702f47d relpipe-data/examples-awk-through-xml.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/relpipe-data/examples-awk-through-xml.xml Sat Dec 28 16:19:41 2019 +0100 @@ -0,0 +1,55 @@ + + + AWKing through a XML file + use AWK to filter data from a D-Bus policy file + 03700 + + + +

+ The AWK programming language and tool is designed for processing text + but in we can use all the power of AWK for processing relational data that came from various sources. + And „all the power“ means that we internally call the regular AWK implementation installed in our system (which is usually GNU AWK). +

+ +

+ In this example, we will read a D-Bus policy configuration file (an XML) + and filter it using a simple AWK expression. + The XML file looks like this: +

+ + + +

+ We separate particular steps of our pipeline to shell functions for better readability and maintenance: +

+ + + +

+ This simple sequence of steps will generate following result: +

+ + + +

+ We have processed two relations. + One (limit) was just passed through + while another (policy) was transformed. + In this case, we did just restriction (filtered certain records), but we can do also projections or other relational operations in our pipelines. +

+ +

+ This example also shows how we can structure our scripts – compose the pipeline from reusable fragments (shell functions). + Once we write the parse function for an input format, we can use it many times, with various filters/transformations and output formatters. +

+

+ Instead of converting to an output format, we can also execute arbitrary system commands for each record + (while having particular attribute values reliably separated in shell variables). +

+ +
+ +
diff -r 780d782cdef5 -r 5cf3a702f47d relpipe-data/examples-in-xmltable-xhtml-outline.xml --- a/relpipe-data/examples-in-xmltable-xhtml-outline.xml Tue Dec 17 00:53:04 2019 +0100 +++ b/relpipe-data/examples-in-xmltable-xhtml-outline.xml Sat Dec 28 16:19:41 2019 +0100 @@ -48,7 +48,7 @@ │ h2 │ Oprava – výměna spínače │ │ h2 │ Myš Razer Orochi │ │ h2 │ Trackball Logitech TrackMan Marble │ - │ h2 │ Myší spínače Omron a⎵Panasonic │ + │ h2 │ Myší spínače Omron a Panasonic │ │ h2 │ Závěr │ ╰────────────────┴────────────────────────────────────╯ Record count: 8]]> diff -r 780d782cdef5 -r 5cf3a702f47d relpipe-data/examples/awk-through-xml.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/relpipe-data/examples/awk-through-xml.sh Sat Dec 28 16:19:41 2019 +0100 @@ -0,0 +1,62 @@ +#!/bin/bash + +getXML() { + # Just read a file: + cat "/etc/dbus-1/system.d/org.freedesktop.NetworkManager.conf" + # Or we can wget or curl it from the network + # or generate on-the-fly using some other command. +} + +parseXML() { + # Convert the XML tree structure into multiple relations. + # Use XPath expressions to find record nodes + # and to find attributes inside them. + relpipe-in-xmltable \ + --relation 'policy' \ + --records '/busconfig/policy/allow|/busconfig/policy/deny' \ + --attribute 'policy' string 'name()' \ + --attribute 'user' string '../@user' \ + --attribute 'context' string '../@context' \ + --attribute 'own' string '@own' \ + --attribute 'send_destination' string '@send_destination' \ + --attribute 'send_interface' string '@send_interface' \ + --attribute 'send_member' string '@send_member' \ + --relation 'limit' \ + --records '/busconfig/limit' \ + --attribute 'name' string '@name' \ + --attribute 'value' integer '.' +} + +filterRecords() { + # Use native AWK command (called from relpipe-tr-awk) + # with all its power to filter the records. + # Work with named fields instead of numbered columns. + relpipe-tr-awk \ + --relation "policy" \ + --where 'policy == "allow" && user != "root"' + + # Of course, we can do the same using SQL: + # relpipe-tr-sql \ + # --relation "policy" \ + # "SELECT * FROM policy WHERE policy = 'allow' AND user <> 'root'" + # --copy 'limit' + + # Or using Guile (Scheme): + # relpipe-tr-guile \ + # --relation policy \ + # --where '(and (string= $policy "allow") (not (string= $user "root")) )' +} + +formatOutput() { + relpipe-out-tabular + # Or generate some other format: + # relpipe-out-ods # spreadsheet for e.g. LibreOffice + # relpipe-out-xml # XML e.g. for further XSLT or XQuery processing + # relpipe-out-recfile # recfile for further GNU Recutils processing + # relpipe-out-asn1 # ASN.1 BER for the telco guys + # relpipe-out-gui # display data in a GUI window + # etc. +} + +# put the whole pipeline together: +getXML | parseXML | filterRecords | formatOutput diff -r 780d782cdef5 -r 5cf3a702f47d relpipe-data/examples/awk-through-xml.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/relpipe-data/examples/awk-through-xml.txt Sat Dec 28 16:19:41 2019 +0100 @@ -0,0 +1,53 @@ +policy: + ╭─────────────────┬───────────────┬──────────────────┬──────────────┬────────────────────────────────┬────────────────────────────────────────────────────┬──────────────────────╮ + │ policy (string) │ user (string) │ context (string) │ own (string) │ send_destination (string) │ send_interface (string) │ send_member (string) │ + ├─────────────────┼───────────────┼──────────────────┼──────────────┼────────────────────────────────┼────────────────────────────────────────────────────┼──────────────────────┤ + │ allow │ whoopsie │ │ │ org.freedesktop.NetworkManager │ │ │ + │ allow │ whoopsie │ │ │ org.freedesktop.NetworkManager │ org.freedesktop.DBus.Introspectable │ │ + │ allow │ whoopsie │ │ │ org.freedesktop.NetworkManager │ org.freedesktop.DBus.Properties │ │ + │ allow │ whoopsie │ │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager │ │ + │ allow │ whoopsie │ │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Connection.Active │ │ + │ allow │ whoopsie │ │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.DBus.Introspectable │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.DBus.Properties │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.DBus.ObjectManager │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Adsl │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Bond │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Bridge │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Bluetooth │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Wired │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Generic │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Gre │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Infiniband │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Macvlan │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Modem │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.OlpcMesh │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Team │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Tun │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Veth │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Vlan │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.WiMax.Nsp │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.AccessPoint │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.WiMax │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device.Wireless │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Device │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Connection.Active │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.DHCP4Config │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.DHCP6Config │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.IP4Config │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.IP6Config │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.VPN.Connection │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Settings │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.Settings.Connection │ │ + │ allow │ │ default │ │ org.freedesktop.NetworkManager │ org.freedesktop.NetworkManager.AgentManager │ │ + ╰─────────────────┴───────────────┴──────────────────┴──────────────┴────────────────────────────────┴────────────────────────────────────────────────────┴──────────────────────╯ +Record count: 39 +limit: + ╭────────────────────────────────┬─────────────────╮ + │ name (string) │ value (integer) │ + ├────────────────────────────────┼─────────────────┤ + │ max_replies_per_connection │ 1024 │ + │ max_match_rules_per_connection │ 2048 │ + ╰────────────────────────────────┴─────────────────╯ +Record count: 2 diff -r 780d782cdef5 -r 5cf3a702f47d relpipe-data/examples/awk-through-xml.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/relpipe-data/examples/awk-through-xml.xml Sat Dec 28 16:19:41 2019 +0100 @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1024 + 2048 + +