
ファイル内でパターンを検索しようとしており、パターンが見つかった場合は、その行とさらに 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行を出力します
-数字
--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'