0

ここで、awk 内から外部コマンドを呼び出し、結果を変数に格納するための優れたヘルプを見つけました。私が見つけることができなかったのは、通常の入力テキスト ファイルの場合と同様に結果に対して awk を動作させる方法です。

リストされているいくつかの IP アドレスを見つけるために、awk を使用して小さな HTML ファイル (実行中の Tahoe LAFS ノードのステータス ページ) を解析します。各 IP アドレスで、特定のポートの nmap スキャンを実行して、ポートが開いているかどうかを確認します (そうです、これは自動化された Tahoe LAFS グリッド モニターになります)。if ステートメントを使用して、2 番目のフィールド (通常は "8098/TCP open unknown") としてポートのステータス (open/filtered/closed) を含む nmap からの出力の行を選択できます。フィールド 1 と 3 の行を取り除き、フィールド 2 のみを保持したいのですが、もちろん $2 は、awk スクリプトへの入力として使用する HTML ファイル内のフィールドを参照します。$2 を返すユーザー定義関数を試してみましたが、これは入力 HTML ファイルのフィールドも参照しています。

awkスクリプト内で内部的に作成された変数のフィールドを参照する方法はありますか? awk スクリプト内にネストされた awk コマンドのようなものですか?

4

2 に答える 2

0

最終的な awk スクリプトの関連部分が大きすぎてコメントに収まらないため、回答として投稿します。stripInputRecord、getIpNumber、および getPortNumber 関数は、HTML コードから有用な部分を選択するだけです。

/address/ {
    ip = stripInputRecord( $0 );
    ip = getIpNumber( ip );
    port[na] = stripInputRecord( $0 );
    port[na] = getPortNumber( port[na] );
    if (!(ip~"N/A")) {
            if (ip~/loopback/) {
                    ip="127.0.0.1";
                    port[na]=stdp;
            }
            cmd="nmap -PN -p "stdp" "ip
            cmd2="nmap -PN -p " port[na] " " ip
            while ((cmd | getline)==1) {
                    if ($0~stdp) {
                            stdportstatus[na] = $2
                    }
            }
            while ((cmd2 | getline)==1) {
                    if ($0~port[na]) {
                            otherportstatus[na] = $2
                    }
            }
    }
    close(cmd)
    close(cmd2)
    if ($0~/N\/A/) {
            stdportstatus[na] = "-";
            otherportstatus[na] = "-";
    }
    na++;

}

みんなありがとう(特にトレック!)

于 2013-08-25T14:37:57.977 に答える