로그 파일을 보고 있는데 파일 이름과 줄 번호에 오류가 있다는 메시지만 나와 있습니다. 제가 관심 있는 것은 래퍼 기능을 이해하는 것입니다. 예를 들어, 다음은 로그 파일의 내용입니다.
Error: foo.file on line wxy
Error: foo.file on line xyz
.
.
.
foo.file 파일의 내용입니다.
function abc_1234 (...)
.
.
.
endfunction
function def_442 ()
.
.
.
//Following line number is WXY
assign Z ==== X;
endfunction
function ghi(...)
.
.
.
//Following line number is XYZ
assign X = X;
endfunction
.
.
.
def_442
위의 로그 파일을 기반으로 함수 이름을 가져 와서 ghi
반환하고 싶습니다 . 나는 다음을 시도했다
# look for function definitions and record the function name
# in the func_name variable
/function [[:alpha:]][[:alnum:]]*[[:blank:]]*([^)]*)/ {
func_name = substr($2, 1, index($2, "(")-1);
}
# when we reach the target line number, print out the current
# value of func_name
NR == target {
print func_name
}
그런데 이전에 자리가 있어서 abc_1234 (...)
실패 했어요def_442 (...)
(
답변1
소스 코드를 올바르게 구문 분석할 수 없으므로 일치하지 않을 수 있는 주석이나 문자열로 신경 쓰지 않아도 됩니다. 아래 스크립트는 단순히 주어진 파일의 주어진 줄 번호에서 거꾸로 문자열을 검색합니다 "function "
(따옴표로 묶음). 볼 수 있습니다):
#!/bin/sh
while read -r error file on line linenum
do
: "SC2034: $error, $on, and $line are unused"
printf 'For error in %s on line %d:\n' "$file" "$linenum"
ed -s "$file" << EOF | sed '1d; s/function //; s/(.*//'
$linenum
?function
q
EOF
echo
done < logfile
외부 while
루프는 이를 logfile
"$file"과 "$linenum"이라는 두 가지 중요한 변수로 읽습니다. 그런 다음 ed
"$file"을 호출하고 지침 목록이 포함된 here 문서를 제공합니다.
- "$linenum" 줄로 이동
- 문자열을 거꾸로 검색
"function "
- 보이지 않는 공간이 있습니다 q
그것
출력은 ed
$linenum 내용과 일치하는 줄의 두 줄입니다 "function "
. 이것이 바로 우리가 모든 출력을 에 전달하는 이유입니다 sed
. 여기에는 세 가지 명령이 제공됩니다.
1d
-- 출력의 첫 번째 줄을 삭제합니다.s/function //
-- 문자열 삭제"function "
s/(.*//
-- 왼쪽 괄호부터 삭제
입력을 기반으로 한 샘플 출력은 다음과 같습니다.
For error in foo.file on line 13:
def_442
For error in foo.file on line 25:
ghi
입맛에 맞게 리뉴얼했습니다.