2017-01-01 4 views
1

Я хочу написать скрипт, который в состоянии выбрать какой-то IP-адресиспользовать переменную сумму в регулярном выражении в Баш

sum=153 
for i in {1..5}; 
do 
cat filename | egrep -o '^([0-9]{1,3}[.] ${sum + i}[.][0-9]{1,3}[.][0-9]{1,3}' 

Имя файла содержит вид IP-адреса. Результат должен быть таким:

*.153.*.* 
*.154.*.* 
*.155.*.* 
*.156.*.* 

Но ничего не выбрано grep вообще.

+0

Что такое вход, и каков выходной сигнал? приведи примеры. – kabanus

+0

10.150.2.3 10.152.2.5 10.153.2.5.10.155.20.22 10.153.20.23 10.153.30.10 10.158.33.4 10.160.11.20 10.142.20.12 10.142.20.11 и более .. в одном столбце – Unixer

+0

почему «10.158.33.4» пропущено из ваш результат (как '153 + 5' дает' 158')? – RomanPerekhrest

ответ

0

Я думаю, что вы хотите:

cut -d"." -f2 inputFile.txt | sort -u | awk '{print "*."$0".*.*"}' 

EDIT:

Если я вам сейчас, то:

awk -F. '{if ($2 >= 153 && $2 <= 156) print $0}' inFile 

будет производить:

10.153.2.5 
10.155.20.22 
10.153.20.23 
10.153.30.10 

Для того, чтобы последняя цифра в 156, чтобы быть переменным от внешнего использования:

i=6 
awk -F. '{if ($2 >= 153 && $2 <= 15'$i') print $0}' inFile 

EDIT 2

Если неясно, как превратить эти результаты в список вы можете итерации по:

x=$(awk -F. '{if ($2 >= 153 && $2 <= 15'$i') print $0}' inFile) 

или вы можете перебрать это немедленно:

for ip in $(awk -F. '{if ($2 >= 153 && $2 <= 15'$i') print $0}' inFile); do 
    //stuff; 
done; 

Или чистый бас:

for ip in $(<Infile); do 
    y=${ip%.*.*}; oct=${y#*.}; 
    if [[ $oct -ge 153 ]] && [[ $oct -le $i ]]; then 
      #Do stuff with $ip! 
    fi 
done 
+0

нет, я хочу выбрать ip-адреса, которые запускают второй октет 153 154 155, противопоставленный $ i – Unixer

+0

@Unixer Так что только сопоставление ip \ *. 15 [3456 .. $ i]. \ *. \ *? Является ли '$ i <= 9'? – kabanus

+0

спасибо, что это сработало для меня – Unixer