Bash 使用(grep?)确定保存哪些文件';还没有下载
我的问题总结如下: 我有两个文本文件(download.txt和list.txt) list.txt包含URL列表,例如:Bash 使用(grep?)确定保存哪些文件';还没有下载,bash,scripting,grep,Bash,Scripting,Grep,我的问题总结如下: 我有两个文本文件(download.txt和list.txt) list.txt包含URL列表,例如: http://example.com/file1.exe http://example.com/file2.exe http://example.com/file3.exe http://example.com/file4.exe http://example.com/file5.exe downloaded.txt包含已下载文件的列表: file1.exe file2.
http://example.com/file1.exe
http://example.com/file2.exe
http://example.com/file3.exe
http://example.com/file4.exe
http://example.com/file5.exe
downloaded.txt包含已下载文件的列表:
file1.exe
file2.exe
file3.exe
file5.exe
我要做的是比较这两个文件,以便查看哪些文件尚未下载(在本例中为file4.exe
我将如何实现这一目标
我试着这么做,但结果是灾难性的(10m+的“结果”,出于某种原因,我不得不一直按enter键让它运行。此外,只有144k行):
读取url时;执行以下操作
如果!grep“$url”download.txt;那么
echo$url;
fi;
完成>文件到下载.txt
使用awk
使用URL中的最后一个元素比较两个文件:
$ awk -F/ 'FNR==NR {downloaded[$0]=$0; next} !($NF in downloaded)' downl list
http://example.com/file4.exe
这将循环文件
downloaded.txt
并将其值存储在数组downloaded[]
中。然后,它循环文件list.txt
并检查最后一个/
-片段是否出现在数组中。如果没有,它将打印该行。使用grep
可以从文件名中读取模式(-f
选项)。在您的情况下,您可以反转匹配(-v
),前提是下载的.txt
中的文件名不显示在路径中的任何位置:
grep -vFf downloaded.txt list.txt
-F
固定字符串是否匹配
这将给出http://example.com/file4.exe
作为输出。要获取文件名:
grep -vFf downloaded.txt list.txt | awk -F/ '{ print $NF }'
输出file4.exe
示例:
% cat list.txt
http://example.com/file1.exe
http://example.com/file2.exe
http://example.com/file3.exe
http://example.com/file4.exe
http://example.com/file5.exe
% cat dl.txt
file1.exe
file2.exe
file3.exe
file5.exe
% grep -vFf dl.txt list.txt
http://example.com/file4.exe
% grep -vFf dl.txt list.txt | awk -F/ '{ print $NF }'
file4.exe
它是否总是像downloaded.txt一样包含list.txt中URL的最后一部分?downloaded.txt仅包含文件名。list.txt包含带有文件名的完整URL。我是否怀疑“您必须一直按enter键才能使其运行”在list.txt中的空行中有其原因,如果grep download.txt,则该空行的结尾为
;然后
从stdin中读取并grepping“download.txt”,您可以添加test-z“$url”&&continue
在while@Jake你可以只做grep-vFf download.txt list.txt
如果你想像我提到的那样,你需要awk
如果你只需要文件名。单独使用awk
似乎是更好的选择,因为它比grep
稍微快一点。
% cat list.txt
http://example.com/file1.exe
http://example.com/file2.exe
http://example.com/file3.exe
http://example.com/file4.exe
http://example.com/file5.exe
% cat dl.txt
file1.exe
file2.exe
file3.exe
file5.exe
% grep -vFf dl.txt list.txt
http://example.com/file4.exe
% grep -vFf dl.txt list.txt | awk -F/ '{ print $NF }'
file4.exe