osx bash grep - 用一行在大文件中查找搜索词

osx bash grep - 用一行在大文件中查找搜索词

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

好的,这应该很容易。

著名遗言。

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

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

在你点击链接之前 - 它超过 244MB,所以请注意 - 它来自 互联网回溯机并包含存档照片的 zip 文件列表。我正在尝试找到我的。

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

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

我尝试使用 less,但无法让它发挥太大作用 —— 它非常慢,而且似乎有同样的问题。

是否有简单的 unix 命令行可以让我隔离搜索词两侧的 512 个字节?

答案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,在我的 macbook pro 上也需要 16 分钟才能处理。每边 10 个字符只需 2 分钟。我没有时间测试每边 255 需要多长时间,大概 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注意::新文件将大小为 244 MB!

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

grep 'search term' json_file_with_breaks

答案3

这更符合你原来的问题

是否有简单的 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
...

每一行保存着每次出现“我的搜索词”时距文件开头的字节偏移量。

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

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

您可以使用循环自动执行上述过程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 个字节)。

相关内容