osx bash grep-1行の大きなファイルで検索語を見つける


-1

非常に大きなテキストファイルに "行"が1つしかない場合でも、検索語の両側にある512バイトを分離できる単純なUNIXコマンドラインはありますか?

わかりました、これは簡単なはずです。

有名な最後の言葉。

私はgrepにそれほど詳しくはありませんが、主に検索用語を含む入力の行を除外するために使用されているようです。

特定の用語を検索するためにダウンロードした非常に大きなjsonファイルがあります。

リンクをクリックする前に-244MB以上あるので注意してください- インターネットウェイバックマシンからのもので アーカイブされた写真のzipファイルのリストが含まれています。私は私のものを見つけようとしています。

彼らのウェブインターフェイスは壊れているので、私は彼らがここで公開しているjsonファイルを見つけました-それはリストの最後のものです。

ユーザー名をgrepで検索すると、それは見つかりますが、その行をコンソールにダンプします。問題は、その行の長さが244MBであり、ファイル内の唯一の行であることです。

私はより少なく使用しようとしましたが、それを多くすることができませんでした-それは非常に遅く、同じ問題があるようです。

入力できるシンプルな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に制限されます。どちらの側でも、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

このコマンドは、すべてのエントリの後に改行を挿入するため、行ごとに1つのエントリを取得します。

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

出力は新しいファイルに保存されますjson_file_with_breaks。複数の検索を行う必要がある場合、毎回grep実行しsedて出力をにパイプするよりも新しいファイルで実行する方が高速になるため、これをお勧めしgrepます。注意:新しいファイルのサイズ 244 MBになります!

次のステップはgrep、新しいファイルの検索に使用することです。

grep 'search term' json_file_with_breaks

0

これは、元の質問の行に沿ったものです

入力できるシンプルなunixコマンドラインはありますか?検索用語の両側にある512バイトを分離できますか?

grepmanページから:

-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

上記のプロセスを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バイト一致)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.