grepまたはackによって返された長い一致する行を切り捨てる方法


89

行が非常に長いことが多いHTMLファイルでackまたはgrepを実行したいと思います。繰り返し折り返される非常に長い行を見たくありません。しかし、正規表現に一致する文字列を囲む長い行のその部分だけを見たいのです。Unixツールの任意の組み合わせを使用してこれを取得するにはどうすればよいですか?


1
なにack?気に入らないときに使うコマンドですか?のようなものack file_with_long_lines | grep pattern?:-)
Alok Singhal 2010年

6
@Alok ackack-grepDebianでは知られています)はgrepステロイドです。--thppptオプションもあります(冗談ではありません)。 betterthangrep.com
ZoogieZork

ありがとう。今日は何かを学びました。
Alok Singhal

1
一方で--thpppt機能がやや物議あり、重要な利点は、あなたがPerlを使用できることであるように思われるいくつかのクレイジーではない、直接正規表現[[:space:]]などの文字{[との意味を変えるなど、-e-E覚えておくことは不可能だように切り替わります。
Evgeni Sergeev 2014年

回答:


99

grepオプションを使用できます-o。おそらく、パターンを".{0,10}<original pattern>.{0,10}"に変更して、その周囲のコンテキストを確認することと組み合わせて使用できます。

       -o、-only-matching
              PATTERNに一致する一致する行の部分のみを表示します。

..または-c

       -c、-count
              通常の出力を抑制します。代わりに、一致する行の数を出力します
              入力ファイルごとに。-v、-invert-matchオプションを使用します(を参照)
              以下)、一致しない行を数えます。

44
例:grep -oE "。{0,20} mysearchstring。{0,20}" myfile
ルノー

14
@Renaud(拡張パターンオプション)で示されるように-Eオプションを追加するように回答を変更する必要があります。そうしないと、コンテキストを拡張するために提案されたパターンが機能しません。
kriss 2013年

それほど必要ではないかもしれませんが、ここに例があります: $ echo "eeeeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwwwrrrrrrrrrrrrrrrrrrrrr" > fileonelongline.txt && grep -oE ".{0,20}MYSTRING.{0,20}" ./fileonelongline.txt プリントqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwww
UlisesLayera18年

これはうまく機能します。ただし、注目すべき欠点は、たとえばを使用するとoE ".{0,20}mysearchstring.{0,20}"、全体が検索パターンになるため、コンテキストに対する内部の「元の」文字列の強調表示が失われることです。視覚的なスキャンと結果の解釈をはるかに簡単にするために、検索結果の周囲にハイライトされていないコンテキストを保持する方法を見つけたいと思います。
アーロンウォレンティン

1
ああ、これが-oE ".{0,x}foo.{0,x}"アプローチを使用することによって引き起こされるハイライトの問題の解決策です(ここxで、はコンテキストの文字数です)-append `| grep foo`を最後まで。ackまたはgrepソリューションのいずれかで機能します。また、ここではより多くのソリューション:unix.stackexchange.com/questions/163726/...
アーロンWallentine

44

結果をパイプしますcut。また、--cutスイッチを追加して、--cut=8080列しか取得できないようにすることも検討しています。


8
一致する部分が最初の80文字にない場合はどうなりますか?
エーテル2010年

3
FWIW私| cut=c1-120はgrepに追加し、私のために働きました(一致したテキストを切り取る方法はわかりませんが)
Jake Rayson 2011

26
| cut=c1-120私のために動作しませんでした、私が行うために必要な| cut -c1-120
ケン・コクランに

1
私は@edibが構文で正確であると考え| cut -c 1-100 stackoverflow.com/a/48954102/1815624
CrandellWS

1
@AndyLester:--no-wrapを使用するオプションは$COLUMNSどうですか?
naught1 0119年

25

長い行を確認して切り刻むためのポケットベルとして使用する量を減らすことができます。ack --pager="less -S" これにより、長い行は保持されますが、折り返す代わりに1行のままになります。線の詳細を表示するには、矢印キーを使用して左/右にスクロールします。

これを行うために、ack用に次のエイリアス設定があります。

alias ick='ack -i --pager="less -R -S"' 

2
--pager常に使用したい場合は、そのコマンドを〜/ .ackrcファイルに入れることができることに注意してください。
アンディレスター

これは、私を大いに悩ませているこの問題に対する最善の解決策のように思えます。使い方を知っていたらいいのにack
ブライアンピーターソン

@BrianPetersonackはほとんど同じですgrepが、最も一般的なケースでのみ単純です
Aaron Wallentine

8
cut -c 1-100

1から100までの文字を取得します。


2

取得元:http//www.topbug.ne​​t/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/

提案されたアプローチ".{0,10}<original pattern>.{0,10}"は、ハイライトの色がめちゃくちゃになることが多いことを除いて、完全に優れています。同様の出力でスクリプトを作成しましたが、色も保持されます。

#!/bin/bash

# Usage:
#   grepl PATTERN [FILE]

# how many characters around the searching keyword should be shown?
context_length=10

# What is the length of the control character for the color before and after the
# matching string?
# This is mostly determined by the environmental variable GREP_COLORS.
control_length_before=$(($(echo a | grep --color=always a | cut -d a -f '1' | wc -c)-1))
control_length_after=$(($(echo a | grep --color=always a | cut -d a -f '2' | wc -c)-1))

grep -E --color=always "$1" $2 |
grep --color=none -oE \
    ".{0,$(($control_length_before + $context_length))}$1.{0,$(($control_length_after + $context_length))}"

スクリプトは次のように保存されていると仮定するとgrepl、その後、grepl pattern file_with_long_lines一致する行を表示しますが、一致する文字列の周りのみ10文字でなければなりません。


動作しますが、次のように末尾のジャンクを出力します:^ [[?62; 9; c。@Jonah Braunの答えが私を満足させたので、私はデバッグを試していません。
sondra.kinsey

1

これが私がすることです:

function grep () {
  tput rmam;
  command grep "$@";
  tput smam;
}

.bash_profileで、grepをオーバーライドしてtput rmam前後に自動的に実行されるtput smamようにします。これにより、折り返しが無効になり、再度有効になります。


実際の試合が出て、画面のその後である場合を除いて... -それは素晴らしい選択肢です
Xerus


0

私は以下を私の中に入れました.bashrc

grepl() {
    $(which grep) --color=always $@ | less -RS
}

その後grepl、コマンドラインで使用可能な任意の引数を使用できますgrep。矢印キーを使用して、長い行の末尾を確認します。q終了するために使用します。

説明:

  • grepl() {:すべての(新しい)bashコンソールで使用できる新しい関数を定義します。
  • $(which grep):のフルパスを取得しますgrep。(Ubuntuは、grepそれに相当するエイリアスを定義していgrep --color=autoます。そのエイリアスは必要ありませんが、元のエイリアスが必要ですgrep。)
  • --color=always:出力を色付けします。(出力がパイプに入れられたことを検出し、それを色付けしない--color=autoため、エイリアスからgrepは機能しません。)
  • $@grepl関数に与えられたすべての引数をここに入れてください。
  • less:を使用して行を表示します less
  • -R:色を表示
  • S:長い行を壊さないでください
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.