简体   繁体   中英

bash + how to capture IP address from line

I have many configuration files , the line that start with LINE word have IP address

My target to read the line that start with LINE word from the file and print only the IP address

The problem is that IP address can be in any field in the line so I can't capture the IP according to field number

example

grep LINE file1.txt

LINE /home/Ariate/run.pl "Voda STS 4 Test -  " "102841" && ssh 17.77.170.130 -p 2022 



grep LINE file2.txt

LINE /home/Ariate/run.pl 137.77.170.30 "Voda STS 4 Test -  " "102841" && ssh  ACTIVE

please advice how to capture the IP address from the line ( solution can be also with perl one liner )

expected results

echo $IP_FROM_LINE

17.77.170.130



echo $IP_FROM_LINE

137.77.170.30
perl -MRegexp::Common=net -lne 'print $1 if /^LINE.*\b($RE{net}{IPv4})/'

Using this grep -oE :

grep -oE '\d+\.\d+\.\d+\.\d+' file
17.77.170.130
137.77.170.30

OR else:

grep -oP '\d+\.\d+\.\d+\.\d+' file
grep -oE '[0-9]{2,3}(\.[0-9]{2,3}){3}'

matches

17.77.170.130
137.77.170.30

or

grep -oP '\d{2}(\.\d{2}){3}'

if your grep supports -P option.

both of them works with the data you have given.

But if you want really worried of what to be matched, use

grep -Eo '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'

which would match excat ip addresses.

The following will get you the desired IP addresses:

grep -oP '^LINE.*\b\K\d+\.\d+\.\d+\.\d+' file

To place the result in a variable as request, you'll need to iterate of the results as follows:

grep -oP '^LINE.*\b\K\d+\.\d+\.\d+\.\d+' file |
while read IP_FROM_LINE ; do
    echo $IP_FROM_LINE
done

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM