特定の行を印刷し、さらにいくつか印刷する

特定の行を印刷し、さらにいくつか印刷する

ファイル内でパターンを検索しようとしており、パターンが見つかった場合は、その行とさらに 10 行の結果を表示したいと考えています。

これまでのところ私は

grep -n pattern file | cut -d: f1 

この出力をどのように使用して、次のようなロジックで印刷を行うのかわかりません

sed -n result,(result+10)p file

パターンが複数行にわたる場合は、おそらくいくつか発行されるでしょう。

ご協力いただければ幸いです

答え1

grep -A動作しない場合は、

awk '/pattern/ {for(i=0;i<number_of_lines;i++){print;getline}}' <filename>

そうでなければ、sedには別のダーティソリューションがあります

sed -n '/pattern/ {p;n;p;n;p;...}' <filename>ここでp->印刷、n->次の行に移動します。したがって、pの数は印刷する行数です。

アップデート:

関数として使用するには、test.shに記述します。

jobcheck(){
  awk "/$1/"' {for(i=0;i<10;i++){print;getline}}' $2
}

それから

source test.sh

走る、

jobcheck "pattern" "file"

更新: Jonathan Lefflerの提案によると、次の10行のいずれかにパターンが含まれている場合は、その行からカウントを開始する必要があります。

pattern  ->start printing from here to next 10 lines
blah
blah
pattern  ->forget about the last 2 lines, start counting from here
blah 
blah

更新されたawkコマンドは次のようになります

awk '/pattern/{max_line=NR+2} {if(NR<=max_line) print}' <filename>

同様にジョブチェック内部も変更されます。よろしくお願いします:)

答え2

grep 2.10 を使用する場合:

grep -A 10 "pattern" your_file

一致後に10行を出力します

からgrep マニュアルページ:

-数字

--after-context=数値

一致した行の後の末尾のコンテキストの num 行を出力します。

GNU awk 3.1.8 を使用:

awk '{if(a-->0) {print; next}} /pattern/{print; a=10}' your_file

答え3

私は以下を使用します:

sed -n '/pattern/{N;N;N;N;N;N;N;N;N;N;p;}'

または

sed '1,/pattern/{/pattern/!d;}' | sed '12,$d'

関連情報