osx bash grep - 在一个包含一行的大文件中查找搜索词


-1

是否有简单的unix命令行,我可以输入,让我隔离一个搜索词两侧的512字节,即使在一个非常大的文本文件中只有一个“行”?

好的,这应该很容易。

著名遗言。

我对grep并不熟悉,但它似乎主要用于过滤输入中包含搜索词的行。

我有一个非常大的json文件,我下载,我想搜索一个特定的术语。

在你点击链接之前 - 它超过244MB因此被警告 - 它来自 互联网的回归机器 并包含存档照片的zip文件列表。我想找到我的。

他们的网络界面坏了,所以我找到了他们公开的json文件 这里 - 这是列表中的最后一个。

当我grep寻找我的用户名时,它找到它,但继续将该行转储到控制台。问题是该行长244MB,它是文件中唯一的一行。

我尝试使用较少,但无法做到这一点 - 它很慢,似乎有同样的问题。

是否有简单的unix命令行,我可以输入,让我隔离说搜索项的任一侧512字节?

Answers:


1

sed几乎就是你所需要的,就像这样:

sed's /.* \(。\ {100 \} eubike。\ {100 \} \)。* / \ 1 /'webshots-index-20121231-index.json

将其返回到控制台:

20121017032138“,”warc“,30012950425],[”eusbike“,”2012-11-11 09:41“,”20121111040120 / webshots.com-user-eusbike-20121111-094102.warc.gz“,34212598,”20121111040120 “,”warc“,19238806437],[”EUSCALDUN“,”2012-11-17 13:

但它是一个很大的但是:你受到RE_DUP_MAX的限制,任何一方都是255。即使是显示100的任何一方,我需要花16分钟处理我的macbook pro。每侧只有2分钟,10个字符。我没有时间测试每一方需要多长时间,可能大约50分钟。限制的原因如下所示 ftp://ftp.ics.uci.edu/pub/centos0/ics-custom-build/BUILD/nagios-plugins-1.4.13/gl/regex.h

如果你想在你的搜索词周围找到很多字符,我想你可能会失败。


2

由于您已经下载了json文件,因此可以对其执行一些文件操作,以便于搜索。

我下载了json文件的前几百个字节,我看到该文件如下所示:

["entry1","date1","file1.gz",int1,"string1","string1",int1],["entry2","date2","file2.gz",int2,"string2","string2",int2],[...

看起来每个条目都在一个单独的json数组中,由...分隔 ],[。您可以使用 sed 用换行符替换这些字符。

sed 's_\],\[_\]\n\[_g' json_file > json_file_with_breaks

此命令将在每个条目后插入换行符,因此每行将获得一个条目:

[... entry1 ...],
[... entry2 ...],
...

输出将保存到新文件, json_file_with_breaks。我建议这样做,因为如果您需要进行多次搜索,请运行 grep 在新文件上将比运行更快 sed 每次和管道输出到 grep NB :新文件将 是244 MB的大小!

下一步是使用 grep 要搜索新文件:

grep 'search term' json_file_with_breaks

0

这更符合原始问题

有没有简单的unix命令行我可以输入哪个让我在搜索词的任一侧隔离512字节?

来自 grep 手册页:

-b, --byte-offset  
      Print the 0-based byte offset within the  input  file  before
      each  line  of output.  If -o (--only-matching) is specified,
      print the offset of the matching part itself.

所以,你可以像这样搜索你的字符串:

grep -o -b 'my search term' json_file

输出:

1234567:my search term
9876543:my search term
...

每行保存从“my search term”每次出现的文件开头的字节偏移量。

您可以使用 cut -bN-M 从文件中的第N个到第M个选择字节:

cut -b$((1234567 - 512))-$((1234567 + 512)) json_file
cut -b$((9876543 - 512))-$((9876543 + 512)) json_file

您可以使用a自动执行上述过程 while 环:

grep -o -b 'my search term' json_file | cut -d: -f1 | while read pos; do cut -b$((pos - 512))-$((pos + 512)); done

这会在文件中找到所有“我的搜索词”,从中删除它们的位置 grep 输出,并且对于每个位置,从json文件中切出匹配任一侧的512个字节(匹配周围总共1024个字节)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.