Trying to get only the lines with ipv4 addresses in the $networks
variable.
#!/bin/bash
ivp4_pattern='/^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$/igm'
networks=$(ip addr | grep "inet" | awk '{print $2}')
while read -r line;
do
echo "$line"
done <<< "$networks"
echo "$ivp4_pattern"
echo "$networks" | grep "$ivp4_pattern"
Output:
[jonathan@localhost ~]$ ./script.sh
127.0.0.1/8
::1/128
172.16.155.128/24
fe80::da84:977a:d654:7716/64
/^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$/igm
Tried removing the /
and with -E
...
#!/bin/bash
ivp4_pattern="'^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$'"
networks=$(ip addr | grep "inet" | awk '{print $2}')
while read -r line;
do
echo "$line"
done <<< "$networks"
echo $ivp4_pattern
echo $networks | grep -E $ivp4_pattern
Also tried loop through networks line by line and taking the regex out of the variable...
#!/bin/bash
networks=$(ip addr | grep "inet" | awk '{print $2}')
while read -r line;
do
echo "$line"
done <<< "$networks"
while read -r line;
do
echo $line
echo $line | grep '^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$'
done <<< "$networks"
I got it working adding -E to grep without regex in variable...but why is it working? It doesn't like the regex being in a variable?
#!/bin/bash
networks=$(ip addr | grep "inet" | awk '{print $2}')
while read -r line;
do
echo "$line"
done <<< "$networks"
while read -r line;
do
# echo $line
echo $line | grep -E '^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$'
done <<< "$networks"
~