Home > Software design >  Figuring out what this sed command do
Figuring out what this sed command do

Time:08-24

I'm having a hard time trying to discover what the next comand is doing.

I'm trying to monitor different services on Linux using systemctl. I need a Json output with all the services on Linux that are running on the machine.

The problem is that with this comand the Status ouput is: "enable enabled". I only need the first parameter (state), and trying to delete the second one (Vendor preset) I really don't get it working. Basically because I don't understand it. I know with Sed is trying to replace some strings but with so many characters for me this isn't readable.

echo "{\"data\":[$(systemctl list-unit-files --type=service|grep \.service|grep -v "@"|sed -E -e "s/\.service\s /\",\"{#STATUS}\":\"/;s/(\s )?$/\"},/;s/^/{\"{#NAME}\":\"/;$ s/.$//")]}" 

Result:

    "data": [{
            "{#NAME}": "accounts-daemon",
            "{#STATUS}": "enabled         enabled"
        },
        {
            "{#NAME}": "acpid",
            "{#STATUS}": "disabled        enabled"
        }, {
            "{#NAME}": "zabbix-agent",
            "{#STATUS}": "enabled         enabled"
        }
    ]
}

Expected result:

    "data": [{
            "{#NAME}": "accounts-daemon",
            "{#STATUS}": "enabled"
        },
        {
            "{#NAME}": "acpid",
            "{#STATUS}": "disabled"
        }, {
            "{#NAME}": "zabbix-agent",
            "{#STATUS}": "enabled"
        }
    ]
}

Command without "sed": systemctl list-unit-files --type=service

UNIT FILE STATE VENDOR PRESET
accounts-daemon.service enabled enabled
acpid.service disabled enabled
zabbix-agent static enabled

CodePudding user response:

The relevant substitute in your code is

s/(\s )?$/

Try to replace that by deleting everyting starting with the first seperator (\s)

That is

s/\s.*$/

The modified command becomes

echo "{\"data\":[$(systemctl list-unit-files --type=service|grep \.service|grep -v "@"|sed -E -e "s/\.service\s /\",\"{#STATUS}\":\"/;s/\s.*$/\"},/;s/^/{\"{#NAME}\":\"/;$ s/.$//")]}"
  • Related