105

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

4

10 に答える 10

107

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

       -o、--マッチングのみ
              PATTERN に一致する一致する行の部分のみを表示します。

..または-c:

       -c, --count
              通常の出力を抑制します。代わりに、一致する行の数を出力します
              入力ファイルごとに。-v、--invert-match オプション (を参照)
              以下)、一致しない行をカウントします。
于 2010-01-09T20:21:56.840 に答える
54

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

于 2010-01-09T21:19:54.127 に答える
26

ACK とチョップの長い行のページャーとして less を使用できます。ack --pager="less -S" これにより、長い行が保持されますが、折り返しではなく 1 行のままになります。行全体を表示するには、矢印キーを使用して左右にスクロールします。

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

alias ick='ack -i --pager="less -R -S"' 
于 2012-06-14T18:02:17.623 に答える
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))}"

スクリプトが として保存されていると仮定するとgreplgrepl pattern file_with_long_lines一致する行が表示されますが、一致する文字列の周りには 10 文字しかありません。

于 2016-08-19T01:51:37.390 に答える