在bash中使用正则表达式中的变量sum

时间:2017-01-01 12:45:49

标签: regex expression

我想写一个能够选择某种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根本没有选择任何东西。

2 个答案:

答案 0 :(得分:0)

我认为你想要的是:

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

修改

如果我现在找到你,那么:

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

编辑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;

或纯粹的bash:

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

答案 1 :(得分:0)

您可以使用

grep -Eo "^[0-9]{1,3}[.] $((sum + i))[.][0-9]{1,3}[.][0-9]{1,3}" filename

要点:

  • 在grep模式周围使用双引号以允许变量扩展
  • 使用$((sum + i))在Bash中实际执行加法。

请参见online demo

sum=152;
s="152. 152.012.123
153. 153.123.123";
grep -Eo "^[0-9]{1,3}[.] $((sum + i))[.][0-9]{1,3}[.][0-9]{1,3}" <<< "$s"
# => 153. 153.123.123