我正在查看一个日志文件,它只告诉我该文件中存在错误的文件名和行号。我感兴趣的是了解封装函数。例如,以下是日志文件的内容
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”并为其提供一个包含指令列表的此处文档,即:
- 转到“$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
重新格式化以适应口味。