--- /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