summaryrefslogtreecommitdiff
path: root/scripts/list_fields.awk
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/list_fields.awk')
-rw-r--r--scripts/list_fields.awk198
1 files changed, 198 insertions, 0 deletions
diff --git a/scripts/list_fields.awk b/scripts/list_fields.awk
new file mode 100644
index 0000000..d8fbbb4
--- /dev/null
+++ b/scripts/list_fields.awk
@@ -0,0 +1,198 @@
+# $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"; }
+ }
+}