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,但它似乎陷入无限循环。
我看到这一点,因为在我运行脚本之后,它会删除副本,但脚本会一直运行。
如果在脚本转动轮子时按Enter键,它会吐出:
sed: no input files
sed: no input files
但您可以清楚地看到重复的IP已被删除:
[/STORAGE/jeremy]# cat jeremy
[/STORAGE/jeremy]# cat jeremy2
209.240.105.0
所以这是它的工作,但是sed命令似乎陷入了循环。我今天才开始真正开始了解更多有关sed它的功能,但它是否有相当于突破;比如c ++或c#?
我只需要sed突破while while循环
输入和输出文件发布在下面,这也不是一个重复的问题。我之前提到过一个关于这个脚本的问题,但这只是为了更好地理解如何在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:
脚本目前的功能。只是我必须手动杀死脚本,而不是突破while while循环
答案 0 :(得分:0)
让我们从这开始,使用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地址的长度。
是吗?
一旦你发布了一些样本输入和预期输出,我们就可以进一步发展。