我成功使用了:
grep -wFf inputqueries.txt seachedfile.txt > results.txt
在 searchedfile.txt 中搜索 inputqueries.txt 中的每个查询。
inputqueries.txt 如下所示:
213.183.56.186
216.176.100.240
216.215.112.149
217.23.49.178
222.29.197.232
23.235.201.32
23.253.150.120
202.112.166.5
searchedfile.txt 看起来像
168.68.129.127 184.73.191.34
199.133.78.171 202.112.166.5
64.180.139.190 199.141.121.11
199.133.186.162 128.118.250.5
54.145.167.92 168.68.129.73
199.154.229.66 23.75.15.164
162.79.16.103 199.134.135.69
results.txt 是正确的
199.133.78.171 202.112.166.5
很遗憾,那就是我的成功停止的地方。当我将其应用于现实世界时,它不起作用。每次它都返回零结果。
我使用了相同的 inputqueries.txt 以及带有单词查询列表(而不是 IP)的文件。此外,值得注意的是,我没有实际日志文件目录的写入权限,并且大多数日志都被压缩为.gz。此外,我试图同时搜索多个相似的文件(zcat http、zcat conn.* 等)
zcat filestosearch.* | grep -wFf /home/username/inputqueries.txt > /home/username/results.txt
不起作用(如果我去掉 -wF 并只留下 grep -f 也不起作用)
zgrep -wFf /home/username/inputqueries.txt filestosearch.* > /home/username/results.txt
也没起作用。
我在现实生活中搜索的日志有所不同,但 http 看起来像......(它们都是兄弟日志)
1432343999.435553 CuCcn04H20cc2ZHyEh 202.170.48.4 50501 197.138.26.55 80 4 GET ndb.nal.usda.gov /ndb/search/autosuggest?manu=&fgcd=&term=Coconut+milk http://ndb.nal.usda.gov/ndb/foods?fgcd=&manu=&lfacet=&count=&max=35&sort=&qlookup=Oil%2C+palm&offset=&format=Abridged&new=&measureby= Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.65 Safari/537.36 0 12994 200 OK - - - (empty) - - - - - FGGh0g4a24L8Q6CZUb text/plain
1432343999.382108 CKPWGW2cubkRjFpTKf 197.166.19.125 63803 54.191.210.216 80 1 GET client.ql2.com /cc/diff/http.www.ars.usda.gov/_22Fpandp_22Flocations_22FcityPeopleList.cfm_23Fmodecode_23D60-64-05-10/20150409123538diff.html - WebTrends/3.0 (WinNT) 00 302 Moved Temporarily - - - (empty) - - - - - - -
1432343999.595036 Cz4XJl3uaq2Fxc0M9a 63.248.145.199 63004 197.155.76.112 80 1 GET start2farm.gov /sites/all/themes/contrib/twitter_bootstrap/images/arrow-green.png http://start2farm.gov/ Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko 0 1498 200 OK - - - (empty) - - - - - Fo69Ao3w36RxKcoH9f image/png
1432343999.732470 CTPQZyQ7tX7BUjU5j 197.123.240.10 56863 216.58.217.132 80 36 GET toolbarqueries.google.com /tbr?client=navclient-auto&ch=63738508926&features=Rank&q=info:/url?q=http://www.ncbi.nlm.nih.gov/books/NBK8125/&sa=U&ei=FjjmVJriAceagwSM1oOIDg&ved=0CBsQFjAB&usg=AFQjCNHgMKW6EIWKxclKB9o-o21bQu7IOw - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.21022; .NET CLR 1.1.4322; .NET CLR 3.5.30729; .NET CLR 3.0.30618) 0 5928 403 Forbidden - -- (empty) - - - - - F2UdRnxrFUEHJFdW4 text/html
使用最简单的单行命令,如何使文件中的 grep 工作?
答案1
问题似乎是文件在 Windows 上的某个时刻被编辑,这\r
在末尾添加了一些通常不可见的额外字符。
如果您有该dos2unix
命令,则可以使用它来转换文件。如果你没有这个并且行尾没有任何重要的空格,你可以使用 GNU sed 来完成,如下所示:
sed -i -e 's/\s*$//' inputqueries.txt
就地修改文件(-i
标志),然后将行末尾的任意数量的空格替换为空,从而有效地删除它。 -i
但它不是 POSIX 的一部分,因此如果您需要便携式解决方案,您可以使用命令的其余部分sed
并重定向到临时文件。当您确定该文件正确时,将其重命名为您真正想要的文件。