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
.
我想在文件(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
.