diff --git a/README.md b/README.md index 068882ad..5f8de637 100755 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ jc [parser] [options] - `--ps` enables the `ps` parser - `--route` enables the `route` parser - `--uname` enables the `uname -a` parser +- `--w` enables the `w` parser ### Options - `-p` specifies whether to pretty format the JSON output @@ -1042,6 +1043,32 @@ $ uname -a | jc --uname -p "kernel_version": "#74-Ubuntu SMP Tue Sep 17 17:06:04 UTC 2019" } ``` +### w +``` +$ w | jc --w -p +[ + { + "USER": "root", + "TTY": "ttyS0", + "FROM": "-", + "LOGIN@": "Mon20", + "IDLE": "2:27", + "JCPU": "10.61s", + "PCPU": "10.53s", + "WHAT": "-bash" + }, + { + "USER": "root", + "TTY": "pts/0", + "FROM": "192.168.71.1", + "LOGIN@": "22:58", + "IDLE": "2.00s", + "JCPU": "0.04s", + "PCPU": "0.00s", + "WHAT": "w" + } +] +``` ## Contributions Feel free to add/improve code or parsers! diff --git a/jc/jc.py b/jc/jc.py index f9de4665..3f77d3a2 100755 --- a/jc/jc.py +++ b/jc/jc.py @@ -21,10 +21,11 @@ import jc.parsers.netstat import jc.parsers.ps import jc.parsers.route import jc.parsers.uname +import jc.parsers.w def helptext(): - print('Usage: jc [parser] [options]\n', file=sys.stderr) + print('Usage: jc PARSER [OPTIONS]\n', file=sys.stderr) print('Parsers:', file=sys.stderr) print(' --df df parser', file=sys.stderr) print(' --env env parser', file=sys.stderr) @@ -40,7 +41,8 @@ def helptext(): print(' --netstat netstat parser', file=sys.stderr) print(' --ps ps parser', file=sys.stderr) print(' --route route parser', file=sys.stderr) - print(' --uname uname parser\n', file=sys.stderr) + print(' --uname uname parser', file=sys.stderr) + print(' --w w parser\n', file=sys.stderr) print('Options:', file=sys.stderr) print(' -p pretty print output\n', file=sys.stderr) print('Example:', file=sys.stderr) @@ -106,6 +108,9 @@ def main(): elif '--uname' in sys.argv: result = jc.parsers.uname.parse(data) + elif '--w' in sys.argv: + result = jc.parsers.w.parse(data) + else: print('jc: missing or incorrect arguments\n', file=sys.stderr) helptext() diff --git a/jc/parsers/w.py b/jc/parsers/w.py new file mode 100644 index 00000000..d84347d4 --- /dev/null +++ b/jc/parsers/w.py @@ -0,0 +1,43 @@ +"""jc - JSON CLI output utility w Parser + +Usage: + specify --w as the first argument if the piped input is coming from w + + +Example: + +$ w | jc --w -p +[ + { + "USER": "root", + "TTY": "ttyS0", + "FROM": "-", + "LOGIN@": "Mon20", + "IDLE": "2:27", + "JCPU": "10.61s", + "PCPU": "10.53s", + "WHAT": "-bash" + }, + { + "USER": "root", + "TTY": "pts/0", + "FROM": "192.168.71.1", + "LOGIN@": "22:58", + "IDLE": "2.00s", + "JCPU": "0.04s", + "PCPU": "0.00s", + "WHAT": "w" + } +] +""" + + +def parse(data): + + # code adapted from Conor Heine at: + # https://gist.github.com/cahna/43a1a3ff4d075bcd71f9d7120037a501 + + cleandata = data.splitlines()[1:] + headers = [h for h in ' '.join(cleandata[0].strip().split()).split() if h] + raw_data = map(lambda s: s.strip().split(None, len(headers) - 1), cleandata[1:]) + return [dict(zip(headers, r)) for r in raw_data] diff --git a/setup.py b/setup.py index f9d24df8..8313ddf2 100755 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ with open('README.md', 'r') as f: setuptools.setup( name='jc', - version='0.9.1', + version='1.0.1', author='Kelly Brazil', author_email='kellyjonbrazil@gmail.com', description='This tool serializes the output of popular command line tools to structured JSON output.',