Here's a way to do it with a single sed
command, eliminating the call to grep
:
ifconfig | sed -n '/inet addr/{s/^.*inet addr:\([^ ]*\).*$/\1/p;q}'
There are a few things going on here:
sed -n
tells sed
not to print every line like it normally does
/inet addr/
is a sed
address - it tells sed
to only operate on lines containing "inet addr"
- The
{
and }
brackets define a block of commands to be run, with the commands separated by a ;
- The
s
command is fairly straightforward - it just captures the IP and replaces the whole line with just the IP
- The
p
flag at the end of the s
command tells sed
to print the result of the substitution. This is necessary because we called sed
with the -n
option.
- The
q
command tells sed
to quit, so that it only processes the first line containing "inet addr"
.
Using the -n
option, the /inet addr/
address, the p
flag on the s
command, and the q
command, essentially has the same effect as grep -m1 "inet addr"
, which makes calling grep
unnecessary. In fact, it's worth noting that the following commands produce identical output:
> ifconfig | grep -m1 "inet addr"
inet addr:192.168.1.1 Bcast:192.168.2.255 Mask:255.255.255.0
> ifconfig | sed -n '/inet addr/{p;q}'
inet addr:192.168.1.1 Bcast:192.168.2.255 Mask:255.255.255.0
Here, I've omitted the s/pattern/replacement/p
part of the sed
command, and replaced it with a p
command (which just prints the whole line), just to show the effect of the other parts in isolation.