#!/bin/rc # cgrep: "context grep" rfork e fn usage{ echo 'usage: cgrep [-n] [-A num] [-B num] [-C num] pattern [file ...]' >[1=2] exit usage } fn isnum{ echo $1 | grep -s '^[0-9]+$' } nflag=0 a=() b=() c=() while(~ $1 -*){ switch($1){ case -n; nflag=1 case -A; a=$2; shift case -B; b=$2; shift case -C; c=$2; shift case *; usage } shift } if(~ $#* 0) usage if(~ $#c 1){ a=$c; b=$c } if not if(~ $#a 0 && ~ $#b 0){ a=2; b=2 } if not{ if(~ $#a 0) a=0 if(~ $#b 0) b=0 } if(! isnum $a) usage if(! isnum $b) usage pat=`{echo $1 | sed 's/\\/\\\\/g'} shift awk ' BEGIN { pat = "'$"pat'" nflag = '$nflag' a = '$a' b = '$b' file = 0 } { if(FNR == 1) { j = a last = 0 file++ } if($0 ~ pat) { if(j == a) { start = FNR - b if(start <= last) start = last + 1 if(last != 0 && start > last + 1) print "--" if(last == 0 && file > 1) print "--" for(i = start; i < FNR; i++) { if(ARGC > 2) printf "%s-", FILENAME if(nflag) printf "%d-", i print buf[(i - 1) % b] } } if(ARGC > 2) printf "%s:", FILENAME if(nflag) printf "%d:", FNR print j = 0 last = FNR } else if(j < a) { if(ARGC > 2) printf "%s-", FILENAME if(nflag) printf "%d-", FNR print j++ last = FNR } else if(b > 0) buf[(FNR - 1) % b] = $0 } ' $*