![일치하는 매개변수 위의 3개 행을 얻는 방법](https://linux55.com/image/138105/%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%20%EC%9C%84%EC%9D%98%203%EA%B0%9C%20%ED%96%89%EC%9D%84%20%EC%96%BB%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
로그 파일에서 일치하는 매개변수 위에 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 3
GNU 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