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

Howdie呢,

我正在写一个脚本,将从两个文件中删除重复的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给我的文件path和IP地址。 我的想法是:用awk将文件path存储在一个variables中,然后使用findfind该文件并使用sed删除重复的IP,于是我将grep语句更改为:

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

它返回:

  ./codingte ./codingt2 

我最初尝试在find命令中使用完整的path名,但是这也不起作用

  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地址的点。 他们需要逃脱,但我不知道如何做到这一点。 我已经阅读了几个小时逃避正则expression式,但我不知道如何与sed做到这一点

任何帮助,将不胜感激。 我只是想了解更多有关正则expression式,并与其他Linux工具,如awk和查找使用它们。

我还没有写完整的脚本。 我试图把它分解成几部分,然后把它放在脚本中。

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

  codingte 123.234.567 codingt2 

第二个文件只会删除IP

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

该命令执行以下操作:

  • 有两个文件: FILE1.txtFILE2.txt
  • 它将在FILE2.txt行中删除(在你的情况下,IP地址)在FILE1.txt找到

你想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 

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

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

似乎在做伎俩。