I'm trying to transform ifconfig -a
to give specific output but I am not sure whether sed is performing well. There is a possibility that the particular version of sed isn't performing as it should (due to different sed counterpart).
My ifconfig -a
output (I only want to see the netmask):
xennet0: flags=8863<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST> mtu 1500
capabilities=2800<TCP4CSUM_Tx,UDP4CSUM_Tx>
enabled=0
address: 0a:3d:c0:98:c6:73
inet 172.31.11.166 netmask 0xfffff000 broadcast 172.31.15.255
inet6 fe80::83d:c0ff:fe98:c673%xennet0 prefixlen 64 scopeid 0x1
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33184
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
Needed output (transformed output):
0xfffff000
0xff000000
My failed attempt:
ifconfig -a | egrep "0xf." | sed 's/inet //' | sed 's/netmask //' |
sed 's/ broadcast//' | sed 's/([0-9]{1,3}\.){3}[0-9]{1,3}//g' | sed 's/\s+//'
It gave me output as:
172.31.11.166 0xfffff000 172.31.15.255
127.0.0.1 0xff000000
I expected it to give my needed output.
Help will be of great assistance. I am using NetBSD 6.1.5 (Amazon EC2), however, I believe any general fixture should work.
You can use grep's ERE engine and the --only-matching
flag to extract just the hex values. To do this, use egrep
or grep -E
to turn on extended regular expressions. For example:
$ egrep -o '0x[[:xdigit:]]{8}' /tmp/corpus
0xfffff000
0xff000000
Likewise, you can also pipe in output and get the same results with:
$ ifconfig -a | egrep -o '0x[[:xdigit:]]{8}'
This works with both GNU and BSD greps, and doesn't rely on the PCRE library. It should therefore work on most modern systems without the need to tweak anything.