/usr/share/doc/lsof/examples/xusers.awk is in lsof 4.89+dfsg-0.1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | #!/usr/bin/awk -f
################################################################
#
# Program Name : xusers
# Date Created : 02-27-97
# Author : Dan A. Mercer
# Email : damercer@mmm.com
# :
# Description : Print list of users and applications signed on
# : X workstations
################################################################
# standard help message
function help(hlpmsg) {
basename = ARGV[0]
sub(/.*\//,"",basename)
printf "Format: %s [o=[hi]] [s=cdlp] [pattern]\n", basename
print "Print list of users and applications signed on X workstations"
print "NOTE: applicationname is truncated to 9 chars"
print "Arguments:"
print " o=[h|i] - Options"
print " h - help - print this message"
print " i - case insensitive pattern search"
print " s=[c|d|l|p] - Sort Options"
print " c - sort by command"
print " d - sort by display name"
print " l - sort by login name"
print " p - sort by pid"
print " pattern - regex pattern to search commands against"
if (length(hlpmsg)) print hlpmsg
exit
}
BEGIN {
# process command line
for (i=1;i<ARGC;i++) {
if (ARGV[i] ~ /^o=/) {
if (options)
help("duplicate option string")
options = ARGV[i]
sub(/^o=/,"",options)
if (options !~ /^[hi]$/)
help("Invalid options " options)
if ("h" == options)
help("")
else
igncase = 1
}
else if (ARGV[i] ~ /^s=/) {
if (sortorder)
help("duplicate sort order string")
sortorder = ARGV[i]
sub(/^s=/,"",sortorder)
if (sortorder !~ /^[cdlp]$/)
help("Invalid sort order: '" sortorder "'")
if ("p" == sortorder) {
sort = "sort -kn2"
}
else if ("c" == sortorder) {
# the 'b' option means ignore leading blanks
sort = "sort -kb3"
}
else if ("l" == sortorder) {
sort = "sort -kb1"
}
else {
sort = "sort -kb4"
}
}
else {
if (pattern)
help("duplicate pattern string")
pattern = ARGV[i]
}
}
# default is to sort by pid
sort = (sort) ? sort : "sort -kn2"
# check for igncase
if (pattern && igncase)
pattern = tolower(pattern)
# set default pattern
pattern = (pattern) ? pattern : ".*"
cmd = "lsof -FpLcn -awP -iTCP:6000"
# ||||| |||| |
# ||||| |||| X servers use port 6000
# ||||| |||don't list port names
# ||||| ||suppress warning messages
# ||||| |and all conditions
# ||||| |options
# |||||
# ||||Internet addresses
# |||command name
# ||login name
# |process id
# Format string
# Output consists of one record per pid, followed by newline
# delimited fields for command, Login name, and network address
# The pid is preceded by a 'p', command by a 'c',
# Login name by an L, and network connection by an 'n'. There may
# be multiple 'n' entries (for instance for vuewm)
while ((cmd | getline field) > 0) {
type = substr(field,1,1)
sub("^.","",field)
if ("p" == type) {
# always output first
pid = field
PID[pid] = ++ct
}
else if ("c" == type) {
# always output second
XAPPL[pid] = field
}
else if ("L" == type) {
# always output fourth
USER[pid] = field
}
else if ("n" == type) {
# may be multiple instances - we just use the last
gsub(".*->|:6000","",field)
DPY[pid] = field
}
}
close(cmd)
printf "%8s %5s %-9s %s\n","USER","PID","COMMAND","DISPLAY"
for (pid in PID) {
if (((igncase) ? tolower(XAPPL[pid]) : XAPPL[pid]) ~ pattern)
printf "%8s %5d %-9s %s\n", USER[pid],pid,XAPPL[pid],DPY[pid] | sort
}
close(sort)
exit
}
|