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
答案 0 :(得分:2)
cat FILE1.txt | while read IP ; do sed -i "/^${IP}$/d" FILE2.txt ; done
该命令执行以下操作:
FILE1.txt
和FILE2.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 /'{} \;
似乎可以解决问题。