grep出力を画面の文字幅に合わせる方法

grep出力を画面の文字幅に合わせる方法

私はしばしば行が非常に長いファイルをgrepして、一致する単語の1つの出力ページを生成します。

端末と幅が同じ文字にのみ出力を制限する良い方法は何ですか?

私はこれが一致する単語を意味することに気づきました可能キューにありません。しかし、まだコンテキストが必要なので、ファイル名だけでは許可されません。

答え1

grepに引数を渡し、出力を$ COLUMNS(またはCOLUMNSが設定されていない場合は80)に切り捨てる次のラッパー関数を検討してください。

function grepcut() {
  grep "$@" | cut -c1-${COLUMNS:-80}
}

次のように使用してください。

$ grepcut sometext somefiles

または

$ set | grepcut LS_COLORS

答え2

これは望ましい結果を提供するより洗練されたアプローチです。通常、単純な文字列(正規表現の特殊文字なし)を検索し、オプションを使用しない場合(または少なくとも同じオプションを使用している場合)に最適です。すべて時間)。私のgreptrimスクリプト:

#!/bin/bash
case "$1" in
    ("")
        echo "Usage: $0 string [files...]"
        exit 2
        ;;
    (-*)
        echo "This script can't take options."
        exit 2
        ;;
esac
read rows cols <<< $(stty size)
if [ "$cols" = "" ]
then
        cols=80
fi
margin=$(( (cols-${#1}) / 2 ))
grep -o ".\{,$margin\}$1.\{,$margin\}" "${@:2}"
  • 準備:空でない文字列(パターン)パラメータが存在し、オプションではないことを確認してください。
  • 次に、別の方法を使用して列数を取得します。1
  • 画面幅(列数)から文字列引数()の幅を減算して${#1}2で除算します。これにより、文字列の左右に含めることができる文字数が計算され、まだ行に収まります。 、80列の画面では、10文字の文字列は margin35です(35 + 10 + 35 = 80なので)。
  • 最終的な順序は少し似ているようですが、grep -o "$@"私たちはそうですgrep -o "$1" "${@:2}"。  "${@:2}"はbashism、つまり意味ですが(何でも)で始まります"$@"$2
  • たとえば、前面と背面$1に梱包します。これは最大35文字と一致するため、パターンは元のパターンを中央に置き、合計最大80文字と一致します。.\{,$margin\}.\{,35\}$1
  • -oこれは、一致するテキストのみが出力されることを意味します。したがって、1行に最大80文字を出力できます。

私は次のサンプルテキストを使用しました。

Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore—
While I nodded, nearly napping, suddenly there came a tapping, As of some one gently rapping, rapping at my chamber door.
“’Tis some visitor,” I muttered, “tapping at my chamber door— Only this and nothing more.”

以下は、80列の画面で実行される例です。

$ ./greptrim or raven.txt
r many a quaint and curious volume of forgotten lore—
ently rapping, rapping at my chamber door.
“’Tis some visitor,” I muttered, “tapping at my chamber d
oor— Only this and nothing more.”

この節には「または」という文字列が6回登場することに注意してください。「fまたは受け取る","私またはに」、「しろまたは"、"訪問するまたは」、「するまたは」と「メーターまたはe"."アクセス"のため、3番目の入力行を2回取得します。または「そして」または」の間隔が39文字以上です。

追加の注:

  • 明らかに、オプションを処理するためにスクリプトを拡張できます。どの引数がパターンで、どの引数がファイル名であるかを理解するのが難しくなります。
  • たとえば、特定のオプションを常に使用するには、スクリプトのコマンド-iにそのオプションを追加するだけです。grep
  • 加えると-n、4〜5を引く必要がありますcols
  • 単純な文字列よりも複雑なパターンを持つスクリプトを使用できますが、短い正規表現が長いテキストセグメントと一致する可能性があるため(またはその逆)、結果が満足できない可能性があります。したがって、計算がmargin間違って、すべての行が長くなる可能性があります。 (またはそれ以下)80文字未満です。
  • 追加された場合は、余白正規-E表現を.{,$margin}(バックスラッシュを削除)に変更する必要があります。
  • オプションの機能は、最後の行を次に変更することです。

    grep -o ".\{,$margin\}$1.\{,$margin\}" "${@:2}" | grep --color=auto "$1"
    

    検索文字列を強調表示:

          同じ出力ですが色があります

    「forget」の「or」は「gate」の「or」とまったく同じであることに注意してください。これは通常、margin行の先頭から始まる文字よりも多くの文字を含む文字列で発生します。

________
1私はcolsこれです(read rows cols <<< $(stty size)

  1. いろいろなアプローチを見せて、
  2. Cygwinを使用していますが、tputまだインストールもできず、COLUMNS設定もできません。

POSIXと互換性があります。

関連情報