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.txt
和FILE2.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 /'{} \;
似乎在做伎俩。