从文件中删除条目后,Sed卡在无限循环中

时间:2014-01-11 05:05:22

标签: bash loops sed awk

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循环

1 个答案:

答案 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地址的长度。

是吗?

一旦你发布了一些样本输入和预期输出,我们就可以进一步发展。