我想查找作为参数给出的执行某个命令的用户的所有名称。 必须使用grep。 我试过了:ps aux | grep $ 1 | cut -d“” - f1,但这不是理想的结果。
答案 0 :(得分:0)
/usr/ucb/ps aux | awk '/<your_command_as_parameter>/{print $1}'|sort -u
例如:
> /usr/ucb/ps aux | awk '/rlogin/{print $1}' | sort -u
答案 1 :(得分:0)
我猜你正在寻找这个。
# cat test.sh
ps aux | grep $1 | grep -v grep | awk '{print $1}'
# ./test.sh bash
root
root
root
答案 2 :(得分:0)
获取进程的信息有一个技巧,但不是搜索进程的进程,即将名称变为正则表达式。例如,如果您要搜索ls
,请将搜索字词设为grep '[l]s'
。除非您正在搜索grep
本身或单个字母的命令名称,否则此方法无效。
这是我使用的procname
脚本;它适用于大多数POSIX shell:
#! /bin/ksh
#
# @(#)$Id: procname.sh,v 1.3 2008/12/16 07:25:10 jleffler Exp $
#
# List processes with given name, avoiding the search program itself.
#
# If you ask it to list 'ps', it will list the ps used as part of this
# script; if you ask it to list 'grep', it will list the grep used as
# part of this process. There isn't a sensible way to avoid this. On
# the other hand, if you ask it to list httpd, it won't list the grep
# for httpd. Beware metacharacters in the first position of the
# process name.
case "$#" in
1)
x=$(expr "$1" : '\(.\).*')
y=$(expr "$1" : '.\(.*\)')
ps -ef | grep "[$x]$y"
;;
*)
echo "Usage: $0 process" 1>&2
exit 1
;;
esac
在bash
中,您可以使用变量子字符串操作来避免expr
命令:
case "$#" in
1) ps -ef | grep "[${1:0:1}]${1:1}"
;;
*)
echo "Usage: $0 process" 1>&2
exit 1
;;
esac
这两个都运行ps -ef
;如果您愿意,可以使用ps aux
。搜索“命令”名称不受命令命令部分的限制,因此您可以使用procname root
查找root运行的进程。匹配也不限于完整的单词;您可以考虑grep -w
(GNU grep
扩展名)。
这些输出是ps
的全部数据;如果您只想要用户(第一个字段),则将输出传递给awk '{print $1}' | sort -u
。