Howdie do,
我目前正在编写一个脚本,该脚本将获取一个IP列表,将它们存储在list中,循环浏览该列表,并将IP与两个文本文件中的IP进行比较。如果两个文件中的IP都重复,则会从其中一个文件中删除IP。
包含重复项的两个文件:
cat jeremy
209.240.105.0
cat jeremy2
209.240.105.0
现在代码很简单:
LIST="$(cat /STORAGE/ips | awk -F ':' '{print $1}')"
for I in $LIST
do
DUP1=$(grep -rwl "$I" /STORAGE/jeremy/ | awk -F '/' '{print $4}' | sed 2d)
DUP2=$(grep -rwl "$I" /STORAGE/jeremy/ | awk -F '/' '{print $4}' | sed 1d)
cat $DUP1 | while read IP; do sed -i "/^${IP}$/d" $DUP2 ; done
done
这实际上是有效的,并从$DUP2文件中删除了重复的IP,但它似乎陷入了无限循环。
我看到这是因为在我运行脚本后,它会删除重复的内容,但脚本只是继续运行。
如果你在脚本转动轮子的时候按下回车键,它就会吐出来:
sed: no input files
sed: no input files
但你可以清楚地看到重复的IP已经被删除:
[/STORAGE/jeremy]# cat jeremy
[/STORAGE/jeremy]# cat jeremy2
209.240.105.0
所以它完成了它的工作,但sed命令似乎陷入了循环。直到今天,我才真正开始了解更多关于sed的能力,但有没有相当于break的东西;像c++或c#?
我只需要sed在读取时突破循环
输入和输出文件发布在下面,而且,这不是一个重复的问题。我之前确实提出了一个关于这个脚本的问题,但那只是为了更好地理解如何将regex与sed和awk一起使用。
生成$LIST 的IP输入文件
209.240.105.0:255.255.255.255:209.240.105.0
209.240.105.1:255.255.255.255:209.240.105.1
我正在测试的两个文件每次只包含一个IP的列表:
Test file #1 jeremy:
209.240.105.0
Test file #2 jeremy2:
209.240.105.0
一旦脚本运行,它应该只从测试文件#2:中删除IP
Test file #1 jeremy:
209.240.105.0
Test file #2 jeremy2:
脚本当前执行的操作。只是我必须手动终止脚本,而不是它在读的时候跳出循环
让我们从这个开始,使用GNU awk作为"\<"单词分隔符:
gawk -F':' '
NR==FNR{ gsub(/./,"\."); ips["\<" $1 "\>"]; next }
{
for (ip in ips) {
if ( match($0,ip) ) {
print ip, FILENAME, RSTART, RLENGTH
}
}
}
' /STORAGE/ips /STORAGE/jeremy/* |
sort
它应该为每个IP地址打印它出现的文件名,加上它第一次出现在每行的字符位置,以及IP地址的长度。
是吗?
一旦您发布了一些示例输入和预期输出,我们就可以更进一步。