AWK脚本函数体澄清

AWK脚本函数体澄清

我正在审查一个 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节中定义为字段分隔符。

相关内容