是否有简单的 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 个字节)。