Question

I am trying to understand how the following command works (from 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 
  }'

This command works well (in SOLARIS 5.10) and shows all the ports opened by processes.

I understand that, pfiles /proc/* displays a bunch of output related to all processes by querying the /proc/ filesystem. From the man-page:

 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.

The output from pfiles is then processed by nawk ('New Awk').

Questions

  1. Could you please explain how NAWK is processing the output of pfiles in the following command? It would be most helpful to know how the parameters f, p and $0 mean.
  2. In the first line, what does redirection of standard error to &- mean? Does it mean the standard error stream is being closed ?
Was it helpful?

Solution

I had to read that script once or twice to make sure I got it straight in my head. It's a little confusing because we see the END at the beginning.

$0 is the entire line.

The line /^[0-9]/ matches the process id (specifically) and that block then sets the sentinel variable f to 0.

The block starting with /INET / matches (and then strips, via the sub(..)) the open port number. The sentinel value f is set to 1 so that we know to print differently when we hit the END. Each time we finish an output collection (ie, the entire output from pfiles for a process), we hit the END block and print the output.

BTW, the RS is the Record Separator.

Running the script on just one process might make it a little easier to get the head around it.

Sorry, forgot to answer your other question re the redirection.

2>&-  

in this context means "redirect stderr from the process to standard input", so that nawk takes input from there rather than a file.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top