我有这个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
删除unregistereddomain3
和domains.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)可以在数百万个大小的列表文件中运行多年,直到它完全占用输入文件为止!
答案 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.)
关于速度:根据正则表达式,性能可能会有很大差异。你使用的那个似乎/可疑/。固定线路匹配最快,几乎总是。