뭔가를 할 것이다 :
awk '
BEGIN{ ARGV[ARGC++] = ARGV[1] }
function prtB(nr) { for (i=FNR-nr; i<FNR; i++) print a[i] }
function prtA(nr) { for (i=FNR+1; i<=FNR+nr; i++) print a[i] }
NR==FNR{ a[NR]; next }
/cat/ { print; prtA(5) }
/dog/ { prtB(4); print }
/monkey/ { prtB(1); print; prtA(1) }
' file
검사에게 수학 함수에서 루프에. 원숭이와 개를 포함하는 줄을 어떻게 처리할지 말하지 않았습니다.
편집 :
awk -v cxts="cat:0:5\ndog:4:0\nmonkey:1:1" '
BEGIN{
ARGV[ARGC++] = ARGV[1]
numCxts = split(cxts,cxtsA,RS)
for (i=1;i<=numCxts;i++) {
regex = cxtsA[i]
n = split(regex,rangeA,/:/)
sub(/:[^:]+:[^:]+$/,"",regex)
endA[regex] = rangeA[n]
startA[regex] = rangeA[n-1]
regexA[regex]
}
}
NR==FNR{
for (regex in regexA) {
if ($0 ~ regex) {
start = NR - startA[regex]
end = NR + endA[regex]
for (i=start; i<=end; i++) {
prt[i]
}
}
}
next
}
FNR in prt
' file
: 여기에서 일치하는 주위 최대 컨텍스트를 인쇄하고 명령 행에서 컨텍스트를 지정할 수 및 위의 저렴하고 쾌활한 솔루션으로 많은 메모리를 사용하지 않을 것입니다 안된 솔루션입니다
cxts 변수에서 검색된 패턴을 RS 값이 기본값 인 개행 문자로 분리하십시오.