如何使用sed和awk的find命令从文件中删除重复的IP

时间:2014-01-11 01:25:48

标签: regex linux bash sed awk

Howdie do,

我正在编写一个脚本,可以从两个文件中删除重复的IP。例如,

 grep -rw "123.234.567" /home/test/ips/
 /home/test/ips/codingte:123.234.567
 /home/test/ips/codingt2:123.234.567

好的,所以IP在两个不同的文件中,所以我需要从第二个文件中删除IP。

grep为我提供了文件路径和IP地址。我的想法:使用awk将文件路径存储在变量中,然后使用find转到该文件并使用sed删除重复的IP,因此我将grep语句更改为:

 grep -rw "123.234.567" . | awk -F ':' '{print $1}'

返回:

 ./codingte
 ./codingt2

我最初尝试在find命令中使用完全路径名,但这不起作用

 find -name /var/cpanel/dips/codingte -exec sed '/123.234.567/d' {} \;

所以,我刚刚在目录中做了一张CD,并将find命令更改为:

 find -name 'codingt2' -exec sed '/123.234.567/d' {} \;

哪个运行,但不删除IP地址:

 cat codingt2
 123.234.567

现在,我知道问题在于IP地址中的点。他们需要逃脱,但我不知道该怎么做。我已经读了几个小时逃避正则表达式,但我不知道如何用sed做到这一点

任何帮助将不胜感激。我只是想了解有关正则表达式的更多信息,并将其与其他Linux工具(如awk和find)一起使用。

我还没有编写完整的脚本。我试图把它分成碎片,然后在剧本中将它们组合在一起。

所以你知道输出应该是什么样的:

 codingte
 123.234.567

 codingt2

第二个文件只会删除IP

3 个答案:

答案 0 :(得分:2)

cat FILE1.txt | while read IP ; do sed -i "/^${IP}$/d" FILE2.txt ; done

该命令执行以下操作:

  • 有两个文件:FILE1.txtFILE2.txt
  • 它会删除FILE2.txt
  • 中的FILE1.txt行(在您的情况下为IP地址)

答案 1 :(得分:1)

您希望grep -l仅打印包含匹配项的文件名:

grep -lrw "123.234.567" /home/test/ips/

会打印

/home/test/ips/codingte
/home/test/ips/codingt2

因此,要跳过第一个文件并继续处理其余文件:

grep -l ... | sed 1d | while IFS= read -r filename; do
    whatever with "$filename"
done

答案 2 :(得分:0)

我认为你只是缺少sed来编辑文件的-i参数。

echo foo>测试 find -name test -exec sed -i's / foo / bar /'{} \;

似乎可以解决问题。