web-dev-qa-db-ja.com

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

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

73
dan

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

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

..または-c

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

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

39
Andy Lester

Ackのページャーとしてlessを使用し、長い行を切り取ることができます:ack --pager="less -S"これは長い行を保持しますが、折り返さずに1行のままにします。より多くの行を表示するには、矢印キーで左右にスクロールします。

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

alias ick='ack -i --pager="less -R -S"' 
21
Jonah Braun
cut -c 1-100

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

5
edib

から取得: 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文字しかありません。

1
xuhdev