从具有与其他文件

时间:2015-12-28 17:56:15

标签: regex bash shell sed grep

我有这个shell脚本:

AVAIL_REMOVAL=$(grep -oPa '^.*(?=(\.com))' $HOME/dcheck/files/available.txt) | sed -i "/$AVAIL_REMOVAL/d" $HOME/dcheck/files/domains.txt

$ HOME / D确认/文件/ available.txt

unregistereddomain1.com available   15/12/28_14:05:27
unregistereddomain3.com available   15/12/28_14:05:28

$ HOME / D确认/文件/ domains.txt

unregistereddomain1
registereddomain2
unregistereddomain3

我想从unregistereddomain1删除unregistereddomain3domains.txt行。怎么可能?

此外,还有比grep更快的解决方案吗?该基准测试显示grep需要最多的时间来执行:Deleting lines from one file which are in another file

修改

这适用于一行文件,但不适用于多行:

sed -i "/$(grep -oPa '^.*(?=(\.com))' $HOME/dcheck/files/available.txt)/d" $HOME/dcheck/files/domains.txt

编辑2:

只需复制此处即可进行备份。域检查器bash脚本需要此解决方案,如果由于某种原因终止,在下次重新启动时,它将从输入文件中删除行:

grep -oPa --no-filename '^.*(?=(\.com))' $AVAILABLE $REGISTERED > $GREPINPUT \
&& awk 'FNR==NR { a[$0]; next } !($0 in a)' $GREPINPUT $DOMAINS > $DOMAINSDIFF \
&& cat $DOMAINSDIFF > $DOMAINS \
&& rm -rf $GREPINPUT $DOMAINSDIFF

这里的大多数域检查器脚本都试图在脚本结束时解决这个问题。但是,当脚本终止运行并且没有正常关闭时,他们没有想到发生了什么?它会再次检查输入文件中的每一行,包括已经检查过的那一行......这个解决了这个问题。这样,脚本(具有适当的服务管理,如docker-compose,systemd,supervisord)可以在数百万个大小的列表文件中运行多年,直到它完全占用输入文件为止!

1 个答案:

答案 0 :(得分:1)

来自man grep

-f file
--file=file

   Obtain patterns from file, one per line. The empty file contains
   zero patterns, and therefore matches nothing. (-f is specified by POSIX.)

关于速度:根据正则表达式,性能可能会有很大差异。你使用的那个似乎/可疑/。固定线路匹配最快,几乎总是。