| # $Id: list_fields.awk,v 1.3 97/09/23 09:32:38 abe Exp $ |
| # |
| # list_fields.awk -- sample awk script to list lsof full field output |
| # (i.e., -F output without -0) |
| # |
| # NB: this is not particularly elegant awk; several sections were |
| # replicated, perhaps unnecessarily, to produce a sample quickly |
| # and simply. |
| # |
| # |
| # Copyright 1994 Purdue Research Foundation, West Lafayette, Indiana |
| # 47907. All rights reserved. |
| # |
| # Written by Victor A. Abell |
| # |
| # This software is not subject to any license of the American Telephone |
| # and Telegraph Company or the Regents of the University of California. |
| # |
| # Permission is granted to anyone to use this software for any purpose on |
| # any computer system, and to alter it and redistribute it freely, subject |
| # to the following restrictions: |
| # |
| # 1. Neither the authors nor Purdue University are responsible for any |
| # consequences of the use of this software. |
| # |
| # 2. The origin of this software must not be misrepresented, either by |
| # explicit claim or by omission. Credit to the authors and Purdue |
| # University must appear in documentation and sources. |
| # |
| # 3. Altered versions must be plainly marked as such, and must not be |
| # misrepresented as being the original software. |
| # |
| # 4. This notice may not be removed or altered. |
| |
| # Clear file and process status. |
| |
| BEGIN { |
| fhdr = fdst = pidst = 0; |
| access = dev = devch = fd = inode = lock = name = offset = ""; |
| proto = size = state = stream = type = ""; |
| cmd = login = pgrp = pid = ppid = uid = ""; |
| } |
| |
| # Start a new process. |
| |
| /^p/ { |
| val = substr($0, 2); |
| if (pidst) { |
| |
| # Print a previously accumulated process set. |
| |
| printf "COMMAND PID PGRP PPID USER\n"; |
| printf "%-9.9s %6d %6d %6d", cmd, pid, pgrp, ppid; |
| if (login != "") { printf " %s\n", login } |
| else { printf " %s\n", uid } |
| pidst = 0; |
| cmd = login = pgrp = pid = uid = ""; |
| } |
| if (fdst) { |
| |
| # Print a previously accumulated file set. |
| |
| if (fhdr == 0) { |
| printf " FD TYPE DEVICE SIZE/OFF INODE NAME\n"; |
| } |
| printf " %4.4s%1.1s%1.1s %4.4s", fd, access, lock, type; |
| t = dev; if (devch != "") { t = devch } |
| printf(" %10.10s", t); |
| t = size; if (offset != "") { t = offset } |
| printf " %10.10s", t; |
| t = inode; if (proto != "") { t = proto } |
| printf " %10.10s", t; |
| t = stream; if (name != "") {t = name } |
| printf " %s", t; |
| if (state != "") { printf " %s)\n", state } else { printf "\n" } |
| access = dev = devch = fd = inode = lock = name = offset = ""; |
| proto = size = state = stream = type = ""; |
| fdst = fhdr = 0 |
| } |
| |
| # Record a new process. |
| |
| pidst = 1; |
| pid = val; |
| } |
| |
| /^g|^c|^u|^L|^R/ { |
| |
| # Save process set information. |
| |
| id = substr($0, 1, 1); |
| val = substr($0, 2); |
| if (id == "g") { pgrp = val; next } # PGRP |
| if (id == "c") { cmd = val; next } # command |
| if (id == "u") { uid = val; next } # UID |
| if (id == "L") { login = val; next } # login name |
| if (id == "R") { ppid = val; next } # PPID |
| } |
| |
| /^f|^a|^l|^t|^d|^D|^s|^o|^i|^P|^S|^T|^n/ { |
| |
| # Save file set information. |
| |
| id = substr($0, 1, 1); |
| val = substr($0, 2); |
| if (id == "f") { |
| if (pidst) { |
| |
| # Print a previously accumulated process set. |
| |
| printf "COMMAND PID PGRP PPID USER\n"; |
| printf "%-9.9s %6d %6d %6d", cmd, pid, pgrp, ppid; |
| if (login != "") { printf " %s\n", login } |
| else { printf " %s\n", uid } |
| pidst = 0; |
| cmd = login = pgrp = pid = uid = ""; |
| } |
| if (fdst) { |
| |
| # Print a previously accumulated file set. |
| |
| if (fhdr == 0) { |
| printf " FD TYPE DEVICE SIZE/OFF INODE NAME\n"; |
| } |
| fhdr = 1; |
| printf " %4.4s%1.1s%1.1s %4.4s", fd, access, lock, type; |
| t = dev; if (devch != "") { t = devch } |
| printf(" %10.10s", t); |
| t = size; if (offset != "") { t = offset } |
| printf " %10.10s", t; |
| t = inode; if (proto != "") { t = proto } |
| printf " %10.10s", t; |
| t = stream; if (name != "") {t = name } |
| printf " %s", t; |
| if (state != "") { printf " %s)\n", state } else { printf "\n" } |
| access = dev = devch = fd = inode = lock = name = offset = ""; |
| proto = size = state = stream = type = ""; |
| } |
| |
| # Start an new file set. |
| |
| fd = val; |
| fdst = 1; |
| next; |
| } |
| |
| # Save file set information. |
| |
| if (id == "a") { access = val; next } # access |
| if (id == "l") { lock = val; next } # lock |
| if (id == "t") { type = val; next } # type |
| if (id == "d") { devch = val; next } # device characters |
| if (id == "D") { dev = val; next } # device major/minor numbers |
| if (id == "s") { size = val; next } # size |
| if (id == "o") { offset = val; next } # offset |
| if (id == "i") { inode = val; next } # inode number |
| if (id == "P") { proto = val; next } # protocol |
| if (id == "S") { stream = val; next } # stream name |
| if (id == "T") { # TCP/TPI state |
| if (state == "") { |
| state = sprintf("(%s", val); |
| } else { |
| state = sprintf("%s %s", state, val); |
| } |
| next |
| } |
| if (id == "n") { name = val; next } # name, comment, etc. |
| } |
| |
| END { |
| if (pidst) { |
| |
| # Print last process set. |
| |
| printf "COMMAND PID PGRP PPID USER\n"; |
| printf "%-9.9s %6d %6d %6d", cmd, pid, pgrp, ppid; |
| if (login != "") { printf " %s\n", login } |
| else { printf " %s\n", uid } |
| } |
| if (fdst) { |
| |
| # Print last file set. |
| |
| if (fhdr == 0) { |
| printf " FD TYPE DEVICE SIZE/OFF INODE NAME\n"; |
| } |
| printf " %4.4s%1.1s%1.1s %4.4s", fd, access, lock, type; |
| t = dev; if (devch != "") { t = devch } |
| printf(" %10.10s", t); |
| t = size; if (offset != "") { t = offset } |
| printf " %10.10s", t; |
| t = inode; if (proto != "") { t = proto } |
| printf " %10.10s", t; |
| t = stream; if (name != "") {t = name } |
| printf " %s", t; |
| if (state != "") { printf " %s)\n", state; } else { printf "\n"; } |
| } |
| } |