1

次のコマンドがどのように機能するかを理解しようとしています(ここから):

<!-- language: lang-bash -->
pfiles /proc/* 2>&- | 
  nawk 'END {
  if (f) print p 
    }
/^[0-9]/ { 
    if (f) print p, RS 
    p = $0
    f = 0
  }
/INET / {
  sub(/.*INET/,"") 
  p = p ? p RS $0 : $0
  f = 1 
  }'

このコマンドは (SOLARIS 5.10 で) うまく機能し、プロセスによって開かれたすべてのポートを表示します。

pfiles /proc/*/proc/ ファイルシステムを照会することにより、すべてのプロセスに関連する一連の出力が表示されることを理解しています。マンページから:

 pfiles              Report fstat(2) and fcntl(2) information
                     for  all  open files in each process. In
                     addition, a path to the file is reported
                     if  the  information  is  available from
                     /proc/pid/path. This is not  necessarily
                     the same name used to open the file. See
                     proc(4) for more information.

pfiles からの出力は、nawk ('New Awk') によって処理されます。

質問

  1. 次のコマンドで、NAWK が pfiles の出力をどのように処理しているか説明していただけますか? fパラメータ、pおよびがどのように機能するかを知ることは最も役に立ちます$0
  2. 最初の行で、標準エラーのリダイレクトとは&-どういう意味ですか? 標準エラーストリームが閉じられているということですか?
4

1 に答える 1

1

そのスクリプトを1、2回読んで、頭の中でまっすぐ理解していることを確認する必要がありました. END が最初にあるので、少し混乱します。

$0全行です。

この行/^[0-9]/は (具体的には) プロセス ID と一致し、そのブロックはセンチネル変数 f を 0 に設定します。

で始まるブロック/INET /は、開いているポート番号に一致します (そして、sub(..) を介してストリップします)。センチネル値 f は 1 に設定されているため、END. 出力コレクション (つまり、プロセスの pfiles からの出力全体) を終了するたびに、END ブロックにヒットして出力を出力します。

ところで、これRSはレコードセパレーターです。

スクリプトを 1 つのプロセスだけで実行すると、理解が少し容易になる場合があります。

申し訳ありませんが、リダイレクトに関する他の質問に答えるのを忘れていました。

2>&-  

このコンテキストでは、「stderr をプロセスから標準入力にリダイレクトする」ことを意味するためnawk、ファイルではなくそこから入力を取得します。

于 2014-03-03T10:43:05.863 に答える