我有一长串域名需要从 /etc/remotedomains 中删除。它们在文件中可能没有任何特定的顺序。每个域都在一行上。
我如何遍历列表并在远程域中找到该行并将其删除。
答案1
grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains
告诉-v
grep 仅输出与模式不匹配的行。
告诉-f list
grep 从文件中读取模式list
。
告诉-F
grep 将模式解释为纯字符串,而不是正则表达式(这样您就不会遇到正则表达式元字符的麻烦)。
告诉-x
grep 匹配整行,例如,如果有一个模式foo
应该只删除行foo
,而不是行foobar
或barfoo
。
答案2
使用通讯!
comm -23 /etc/remotedomains remove
从手册页:
逐行比较排序后的文件 FILE1 和 FILE2。
如果没有选项,则生成三列输出。第一列包含 FILE1 特有的行,第二列包含 FILE2 特有的行,第三列包含两个文件共有的行。
选项 -1、-2 和 -3 禁用相应的列。
但它确实要求对文件进行排序。
答案3
sed -r -i -e '/^(domain1|domain2|domain3|...|domainN)$/d' domainlist.txt
如果要删除的域列表位于文件中,则:
sed -r -i -e '/^'"$(xargs <removelist.txt|sed -e 's/ /|/g)"')$/d' domainlist.txt
笔记:
使用 -i.bak 让 sed 备份 domainlist.txt
如果removelist.txt有许多数千个条目,它可能会溢出最大命令行长度。这种情况不太可能发生,但您应该注意。
经过进一步思考,可以通过以下方式消除该风险:
for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done