web-dev-qa-db-ja.com

grepはコンテキストを表示できますが、完全な行は表示できませんか?

非常に長い行がいくつかあるファイルがあります。ファイル内で複数回発生する可能性がある文字列をgrepしたい。

$ cat 2014-11-03.json | grep 218

これは判読できない出力を生成します。それが多すぎます。

$ cat 2014-11-03.json | grep -o 218

これはあまりにも削減します。一致するパターンのみが表示され、コンテキストはありません。

基本的に、次のような出力が必要です

... <category_id>218</category_id> ...

(はい、これはXMLですが、XMLを解析したくありません。一致した文字列をその両側に数文字で出力したいだけです。行全体ではなく数文字だけです。)

Grepには、一致した文字列、または完全な行のコンテキストでの一致した文字列(デフォルトの動作)、または一致した文字列のみを表示するオプションがあるようです前後の数行のコンテキストで文字列が表示されますが、前後の数文字のコンテキストで一致した文字列を表示するオプションが見つかりません。

$ cat 2014-11-03.json | tr ' ' '\n' | grep 218 

これは理想的ではありません。問題のファイルにほぼ適切な場所にスペースがある限り、機能します。今回はうまくいきましたが、再びうまくいく保証はありません。

10
TRiG

この質問は古いですが、行の一部だけをgrepする方法を探しているときにつまずいたので、ここに行きます:

回避策は、オプション「only-matching」を有効にしてから、RegExpの機能を使用してテキストよりも少し多くgrepを実行することです。

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}" ./filepath

もちろん、色の強調表示を使用している場合は、いつでもgrepを実行して、実際の一致のみに色を付けることができます。

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}"  ./filepath | grep "WHAT_I_M_SEARCHING"

注意:

  • これは、1行に複数の一致がある場合、すべての期待される結果を返さない可能性があります。
  • この正規表現は遅いです。非常に遅い。 (可能な解決策についてはコメントを参照してください)
12
Jehan Bruggeman

Jsonをきれいな形式で表示する方法は、pjsonを使用することです。フォーマット後、grepコマンドを追加できます。

$ echo '{"test1":"t1","test2":"t2"}' | pjson
{
   "test1": "t1",
   "test2": "t2"
}

pipを使用してインストールします。

pip install pjson

次に、jsonコンテンツをpjsonにパイプします。

0
jherran