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

我必须阅读该脚本一两次,以确保我的头脑清楚。这有点令人困惑,因为我们在开头看到了 END。

$0是整条线。

该行/^[0-9]/与进程 ID 匹配(具体而言),然后该块将哨兵变量 f 设置为 0。

以匹配开头的块/INET /(然后通过 sub(..) 剥离)打开的端口号。哨兵值 f 设置为 1,以便我们知道当我们点击END. 每次我们完成一个输出集合(即一个进程的 pfiles 的整个输出)时,我们点击END 块并打印输出。

顺便说一句,这RS是记录分隔符。

仅在一个进程上运行脚本可能会更容易理解它。

对不起,忘了回答你的其他问题重新重定向。

2>&-  

在这种情况下,意味着“将 stderr 从进程重定向到标准输入”,因此nawk从那里获取输入而不是文件。

于 2014-03-03T10:43:05.863 回答