我正在审查一个 bash 脚本,尽管我努力通过谷歌搜索来破译这个特定函数的工作原理,但我还是被卡住了。
我得到了 gettimestamp 和 printeverything 的部分以及它的调用方式。然而从 ORA 开始直到 Housetype 我不确定它是如何工作的。根据这个AWK教程AWK 中有预定义的函数,并且它总是以 function 开头,但我看不到“<---Section is Albany---->”中包含的代码的任何参考或示例。我并不是要求任何人解释整个代码,但特别是如果您至少可以解释 /^DocType\|/ 部分如何工作。请参阅下面我的评论。
func_sql()
{
ITMF=$TMF.2
_retrieve | _run_sqlplus 2>&1 | ${_APP_AWK} -vtmf=$ITMF '
BEGIN {
FS = "^B";
cnt=0;
printf("umask 007;\n") >>tmf
printf("cd %s;\n", imgDir) >>tmf
}
function getTimeStamp(s) {
printf("%s %s\n", strftime("[%a %b %d %H:%M:%S]"), s) >>logFile
}
function printEverything(s) {
printf("<P>%s %s\n", strftime("[%a %b %d %H:%M:%S]"), s);
printf("%s %s\n",
strftime("[%a %b %d %H:%M:%S]"),
s) >>logFile
}
<--- This section is confusing ------>
/^ORA-.*:|^PLS-.*:|^SP2-.*/ { <-- I don't understand this part
getTimeStamp($0) <--- I understand this
printf("\nSQLBAD|1000|%s\n", $0); <--- I understand this
exit(1); <--- I understand this
}
/^ERROR/ { <-- I don't understand this part
<--Truncated-->
}
/\[.*\]\|Error.*/ { <-- I don't understand this part
<--Truncated-->
}
/^HouseType\|/ { <-- I don't understand this part
gsub("[[:space:]]+", " ");<--- I understand this
gsub("^[[:space:]]+", "");<--- I understand this
gsub("[[:space:]]+$", "");<--- I understand this
gsub("[[:space:]]+^B", "^B");<--- I dont' know this bit, what does ^B stands for?
gsub("^B[[:space:]]+", "^B");<--- I dont' know this bit, what does ^B stands for?
if($0 == "")
next;
print "<option value=\"" $2 "\">" $3 "</option>";
next;
}
{
gsub("[[:space:]]+", " ");
gsub("^[[:space:]]+", "");
gsub("[[:space:]]+$", "");
if($0 == "")
next;
}
<--- This section is confusing ------>
END {
printf("cnt=%s\n", cnt);
}
'
答案1
看来您是在说您不理解的部分内容是 的正则表达式触发语法awk
,它从中获得了很多功能。为了简化,脚本的脚手架awk
可以这样描述:
BEGIN {
Things to do before processing data
}
/needle/ {
Things to do when a record contains a match for the regex /needle/
}
expression {
Things to do for each record when the expression evaluates to true (i. e. nonzero)
}
{
Things to do for all input records
}
END {
Things to do after all records have been processed
}
要扩展您引用的行:
/^ORA-.*:|^PLS-.*:|^SP2-.*/ {
stuff
}
/^ORA-.*:|^PLS-.*:|^SP2-.*/
是一个正则表达式,匹配任何符合以下任一条件的字符串:
- 以 开头
ORA-
,随后:
零个或多个后续字符 - 以 开头
PLA-
,随后:
零个或多个后续字符 - 以。。开始
SP2-
该表达式后面的花括号中的代码将在任何匹配的记录上运行。
/^ERROR/ {
stuff
}
一个更简单的正则表达式,它匹配任何以 . 开头的字符串ERROR
。
/\[.*\]\|Error.*/ {
stuff
}
另一个正则表达式,这次匹配以带有匹配的方括号对的任何内容开头的字符串,或以字符串 开头的任何内容Error
。
gsub("[[:space:]]+^B", "^B");
gsub("^B[[:space:]]+", "^B");
这些将在第一种情况下替换与空格后跟Ctrl+B字符匹配的任何系列字符,或者在第二种情况下用简单的Ctrl+替换相反的顺序B。请记住,该控制字符在BEGIN
节中定义为字段分隔符。