Skip to content
Advertisement

Unable to parse bash output using regex and collect a part of it

I am trying to parse out the recent load, from the output of this command –

[sandeepan@ip-10-169-92-150 ~]$ w
 14:22:21 up 17 days, 51 min,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
sandeepa pts/0    115.112.95.170   06:38   43:57   0.51s  0.51s -bash
sandeepa pts/1    115.112.95.170   13:17    4.00s  0.03s  0.00s w

The first one after the load average: –

                |
               |/
load average: 0.00, 0.01, 0.05

I was using this, which worked –

w | awk '{print $10}' | tr -d ,

However, I realised that the value I am looking for may not always be the 10th variable. Hence I am trying to use regex here, but unfortunately, not able to use it with any of the few bash commands/utilities I know.

I have this regular expression, with which I am able to match the desired value –

/.*load average:s([0-9]+.[0-9]+),.*/m

I tried looking at the sed manual, looking at some other questions like Using sed to remove unwanted characters from output, but could not understand much to make mine working.

Advertisement

Answer

When you know what text comes before and after, it is best to use a look-behind that does this: checks the text in a given place, no matter what is the rest of the line.

Given your sample file, I stored it in a file and did this:

$ grep -Po '(?<=load average: )[^,]*' file
0.00

This is saying: hey, get all the text after load average: and until a comma is found.

So if you have a file like this:

$ cat file
14:22:21 up 17 days, 51 min,  2 users,  load average: 0.00, 0.01, 0.05
hello how are you,  load average: 1.23, 0.01, 0.05

It will return as follows:

$ grep -Po '(?<=load average: )[^,]*' file
0.00
1.23

Note by the way that man w can give you good hints on how to get this info with some options, as well as man top.

User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement