Bash 脚本查找 ip 地址的序列号

Bash script find sequence numbers of ip address

我想在文件(bash脚本)中找到一个序列号,如果有人能给我提示的话。 我有一个 IP 地址为

的文件

喜欢。

172\.15.0.1
172\.15.0.6
172\.15.0.7
172\.15.0.8
172\.15.0.10
172\.15.0.15
172\.15.0.16

我想找到前 3 个序列号

像这样

172\.15.0.6
172\.15.0.7
172\.15.0.8

我尝试使用 grep、sed、awk 或循环,但找不到我想要的结果。

这应该给出:

echo "172.15.0.1 172.15.0.6 172.15.0.7 172.15.0.8 172.15.0.10 172.15.0.15 172.15.0.16" | grep -oP $(echo 172.15.0.{6..8} | tr ' ' '|')
172.15.0.6
172.15.0.7
172.15.0.8

编辑 2:

这是我的第二次尝试:

j=0
i=2
myip=172.15.0
allIPs="$myip.1 $myip.2 $myip.6 $myip.7 $myip.8 $myip.10 $myip.15 $myip.16"
# while less or equal than 255
while [ $i -le 255 ] ; do
    # we will build a string that has a sequence range, for example 172.15.0.38|172.15.0.39|172.15.0.40
    ips=""
    # this builds the ip range sequence and adds it to ips
    for ip in $(seq $j $i); do ips=${ips}$(echo -n 172.15.0."$ip")"|"; done
    # we remove the last character which is '|'
    ips=${ips::-1}
    # this is the result that will match the sequence range
    res=$(echo $allIPs | grep -oP $ips)
    # if it matches, it will print it by checking that the IPs are actually found
    if [ $(echo $res | tr ' ' '\n' | wc -l) == 3 ]; then 
        echo $res
    fi
    # to next range
    j=$i
    i=$(( $i + 2 ))
done
# this is for the last sequence which is 253, 254, 255
res=$(echo $allIPs | grep -oP "$myip.253|$myip.254|$myip.255")
if [ $(echo $res | tr ' ' '\n' | wc -l) == 3 ]; then echo $res; fi

应该给

172.15.0.6 172.15.0.7 172.15.0.8

给定一个由空格分隔的 ip 地址范围的文件,这个 awk 解决方案可能就是您正在寻找的:

$ awk -vRS=" " '/172.15.0.[6-8]/{print}' file.txt 
172.15.0.6
172.15.0.7
172.15.0.8

-vRS部分表示RS(记录分隔符)变量设置为一个空白字符。

你能试试bash脚本吗:

#!/bin/bash

report() {
    local seg=${1%.*}
    for (( i =  - 2; i <= ; i++ )); do
        echo "$seg.$i"
    done
}

prev=255                                # initial value as a workaround
while IFS= read -r ip; do
    n=${ip##*.}                         # extract the last octet
    if (( n == prev + 1 )); then
        (( count++ ))
        if (( count >= 2 )); then       # found three sequences
            report "$ip" "$n"           # then report them
        fi
    else
        count=0                         # reset the count if fail
    fi
    prev=$n
done < <(tr -s ' ' '\n' < input_file.txt | sort -t. -nk4,4)

其中 input_file.txt 是包含 IP 地址的文件名。
使用提供的文件输出:

172.15.0.6
172.15.0.7
172.15.0.8
  • tr -s ' ' '\n' 将空格替换为换行符,因此 输出可以馈送到 sort 命令。
  • sort -t. -nk4,4 用最后一个八位字节按数字顺序对输入进行排序。
  • 输出通过进程替换被送入while循环 < <(commands).
  • 现在 while 循环逐行处理输入(逐个 ip)。
  • 变量 n 分配给最后一个(第 4 个)八位字节。
  • n 与保存最后一行数字的 prev 进行比较。 如果 n == prev + 1 成立,则数字按顺序排列。 然后累加count
  • 如果count达到2,则包括当前行在内的三行 在序列中。然后参数传递给函数report.