it-swarm-ja.com

grepを使用する;パターンのN番目の出現を表示するにはどうすればよいですか?

grepを使用する; N thパターンの発生?

例えば; man sh |grep -A3 -- '-c'はいくつかの一致を返します。

rdオカレンスのみを分離して、次のように表示したい場合があります。

--
    -c  Read commands from the command_string operand instead of from the standard input.  Special parameter 0
        will be set from the command_name operand and the positional parameters ($1, $2, etc.)  set from the
        remaining argument operands.
-- 
1
voices

必要なオカレンスはsecondオカレンスではありません。 サードです。 3行のコンテキストで_-c_の3番目のオカレンスを取得するには:

_$ man sh | awk '/-c/{n++; if (n==3)f=3;} f{print;f--;}'
           -c               Read commands from the command_string operand instead of from the standard input.  Special param‐
                            eter 0 will be set from the command_name operand and the positional parameters ($1, $2, etc.)
                            set from the remaining argument operands.
_

使い方

awkは、入力を1行ずつ暗黙的に読み取ります。このスクリプトは2つの変数を使用します。 nは、_-c_を見た回数を追跡します。 fは、印刷することになっている行数を追跡します。

  • /-c/{n++; if (n==3)f=3;}

    _-c_を含む行に到達したら、カウントnを1つインクリメントします。 nが3の場合、fを3に設定します。

  • _f{print;f--;}_

    fがゼロ以外の場合は、行を出力してfをデクリメントします。

代替ソリューション

_$ man sh | grep -A3 -m3 -- -c | tail -n4
           -c               Read commands from the command_string operand instead of from the standard input.  Special param‐
                            eter 0 will be set from the command_name operand and the positional parameters ($1, $2, etc.)
                            set from the remaining argument operands.
_

_-m3_オプションは、最初の3つの一致のみを返すようにgrepに指示します。 _tail -n4_は、これらの一致の中から最後の4行を返します。ただし、_-c_への2番目と3番目の一致がコンテキスト行数の範囲内であった場合、この出力は希望どおりでない可能性があります。

2
John1024