blob: d8fbbb41f59c7be337e7d25c3dba137d065872c8 [file] [log] [blame]
# $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"; }
}
}