일치하는 매개변수 위의 3개 행을 얻는 방법

일치하는 매개변수 위의 3개 행을 얻는 방법

로그 파일에서 일치하는 매개변수 위에 3줄을 인쇄하고 싶습니다. 다음 명령을 사용하고 있는데 오류가 발생합니다. 대안이 있습니까?

grep -A 3 "예외" Services.log

다음과 같은 오류가 발생합니다.

grep: Not a recognized flag: A
Usage: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] -e pattern_list...
        [-f pattern_file...] [file...]

답변1

다음 awk명령은 문자열 exception과 "컨텍스트 앞" 세 줄을 포함하는 줄을 제공합니다( -B 3GNU grep및 기타 grep구현 사용).

awk 'BEGIN { bc=3 } { lines[NR%(bc+1)] = $0 } /exception/ { for (i=1; i<=(bc+1); ++i) print lines[(NR+i)%(bc+1)] }' file

lines이렇게 하면 원하는 "컨텍스트 전" 줄 수인 줄 bc+1의 "원형 버퍼"가 유지됩니다 . bc행이 패턴과 일치하면 exception해당 버퍼의 내용이 인쇄됩니다.

이는 일치가 발생하는 경우를 올바르게 처리하지 않습니다.이내에bc다른 일치 항목의 "전 컨텍스트" 또는 첫 번째 일치 항목 이 파일의 줄 수 보다 적게 발생하는 파일의 위치입니다 .

특정 패턴 전후에 구성 가능한 양의 컨텍스트를 제공하는 스크립트로 일반화되었습니다.

#!/bin/sh

# Usage:
#    ./script [ -A n ] [ -B n ] PATTERN FILE ...

after=0
before=0

while getopts 'A:B:' opt; do
    case $opt in
    A)
        after=$OPTARG
        ;;
    B)
        before=$OPTARG
        ;;
    *)
        echo 'error in command line parsing' >&2
        exit 1
    esac
done
shift "$(( OPTIND - 1 ))"

pattern=$1
shift

pattern=$pattern awk -v bc="$before" -v ac="$after" '
    { lines[NR%(bc+1)] = $0 }
    $0 ~ ENVIRON["pattern"] {
        for (i=1; i<=(bc+1); ++i) print lines[(NR+i)%(bc+1)]
        print_after=ac
        next
    }
    print_after > 0 { print; print_after-- }' "$@"

테스트해보세요:

$ cat file
1
2
3
4
5
exception
6
7
8
9
0
exception
$ sh script.sh -B 3 exception file
3
4
5
exception
8
9
0
exception
$ sh script.sh -A 3 exception file
exception
6
7
8
exception
$ sh script.sh -A 1 -B 1 exception file
5
exception
6
0
exception

답변2

간단하지만 반드시 효과적이지는 않습니다.

tac Services.log | awk '/exception/ {L = NR + 4} NR < L' | tac

관련 정보