Script-friendly (parseble) ps(1) output?

Oliver Fromme olli at
Thu Oct 30 07:19:00 PDT 2008

Eduardo Meyer wrote:
 > I need to write a cgi script which will print the output from ps(1) in
 > a table (html), so the average-operator can click on a KILL link and
 > the cgi will send the selected signal.
 > I need to add one ps information per column in a table (html),
 > however, I found ps(1) output to be too hard to parse. There is no
 > separator. I believed \t was the separator but its not.
 > The ps(1) command I need to use is:
 > ps -ax -o pid -o user -o emul -o lstart -o lockname -o stat -o command

You should use -axww so the command is not truncated.

 > Since many of those args use [:space:] in the output, I can not use
 > [:space:] as a separator.

Yup, that's a problem.  That's why a simple awk line won't
do it.  You should use fixed character positions instead
of field separaters for splitting fields.

I think you can look at the headers (first line) to determine
the field widths.  All fields are left-aligned except for
the PID.  So your script should simply look at the first line
and store the starting position of every word in an array.

Using those values you can split all the data lines according
to the character positions.

I could provide a 3-liner in Python, but I assume you're not
writing that script in Python.  :-)

Best regards

Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. M.
Handelsregister: Registergericht Muenchen, HRA 74606,  Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsregister: Registergericht Mün-
chen, HRB 125758,  Geschäftsführer: Maik Bachmann, Olaf Erb, Ralf Gebhart

FreeBSD-Dienstleistungen, -Produkte und mehr:

C++: "an octopus made by nailing extra legs onto a dog"
        -- Steve Taylor, 1998

More information about the freebsd-stable mailing list