Return only the portion of a line after a matching pattern
The canonical tool for that would be sed
.
sed -n -e 's/^.*stalled: //p'
Detailed explanation:
-n
means not to print anything by default.-e
is followed by a sed command.s
is the pattern replacement command.- The regular expression
^.*stalled:
matches the pattern you're looking for, plus any preceding text (.*
meaning any text, with an initial^
to say that the match begins at the beginning of the line). Note that ifstalled:
occurs several times on the line, this will match the last occurrence. - The match, i.e. everything on the line up to
stalled:
, is replaced by the empty string (i.e. deleted). - The final
p
means to print the transformed line.
If you want to retain the matching portion, use a backreference: \1
in the replacement part designates what is inside a group \(…\)
in the pattern. Here, you could write stalled:
again in the replacement part; this feature is useful when the pattern you're looking for is more general than a simple string.
sed -n -e 's/^.*\(stalled: \)/\1/p'
Sometimes you'll want to remove the portion of the line after the match. You can include it in the match by including .*$
at the end of the pattern (any text .*
followed by the end of the line $
). Unless you put that part in a group that you reference in the replacement text, the end of the line will not be in the output.
As a further illustration of groups and backreferences, this command swaps the part before the match and the part after the match.
sed -n -e 's/^\(.*\)\(stalled: \)\(.*\)$/\3\2\1/p'
The other canonical tool you already use: grep
:
For example:
grep -o 'stalled.*'
Has the same result as the second option of Gilles:
sed -n -e 's/^.*\(stalled: \)/\1/p'
The -o
flag returns the --only-matching
part of the expression, so not the entire line which is - of course - normally done by grep.
To remove the "stalled :" from the output, we can use a third canonical tool, cut:
grep -o 'stalled.*' | cut -f2- -d:
The cut
command uses delimiter :
and prints field 2 till the end. It's a matter of preference of course, but the cut
syntax I find very easy to remember.
I used ifconfig | grep eth0 | cut -f3- -d:
to take this
[root@MyPC ~]# ifconfig
eth0 Link encap:Ethernet HWaddr AC:B4:CA:DD:E6:F8
inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:78998810244 errors:1 dropped:0 overruns:0 frame:1
TX packets:20113430261 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:110947036025418 (100.9 TiB) TX bytes:15010653222322 (13.6 TiB)
and make it look like this
[root@MyPC ~]# ifconfig | grep eth0 | cut -f3- -d:
C4:7A:4D:F6:B8