AWKスクリプト関数本体の説明

AWKスクリプト関数本体の説明

私はbashスクリプトを検討していますが、この特定の機能がどのように機能するかを復号化するためにインターネット検索を試みましたが、詰まっています。

私はgettimestampを取得し、すべての部分とそれが呼び出される方法を印刷しました。しかし、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+文字が続くスペースに一致する一連の文字を置き換えるか、2B番目のケースでは単純な+でCtrl逆順に置き換えますB。この制御文字は、BEGINセクションでフィールド区切り文字として定義されていることに注意してください。

おすすめ記事