这个NAWK脚本如何显示Solaris上进程使用的端口?

时间:2014-03-03 09:47:04

标签: process solaris ports nawk

我试图了解以下命令的工作原理(来自here):

<!-- 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 / filesystem显示与所有进程相关的一堆输出。从手册页:

 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的输出?了解参数fp$0的含义最为有用。
  2. 在第一行中,将标准错误重定向到&-意味着什么?这是否意味着标准错误流是closed

1 个答案:

答案 0 :(得分:1)

我必须读一遍或两次这个剧本,以确保我直接进入 我的头。这有点令人困惑,因为我们在开始时看到了END。

$0就是整行。

/^[0-9]/匹配进程ID(特别是)和该块 然后将sentinel变量f设置为0.

/INET /开头的块匹配(然后剥离,通过子(..)) 开放的端口号。 sentinel值f设置为1,以便我们知道 当我们点击END时,打印方式会有所不同。每次我们完成输出 集合(即进程的pfiles的整个输出),我们点击了END 阻止并打印输出。

BTW,RS是记录分隔符。

只在一个进程上运行脚本可能会让它更容易获得 围绕它的头。

抱歉,忘记回复重定向问题。

2>&-  

在此上下文中表示“将stderr从进程重定向到标准输入”, 以便nawk从那里获取输入而不是文件。