psgrep 命令用于通过关键字筛选系统当前正则运行的进程, 基于linux命令ps 和grep, 主要特性:
支持批量查询, 可同时查看多个关键字, 多个关键字之间是或的关系查询列表中每行为一个独立的进程,不自动换行查询列表中自带索引号查询列表中关键字高亮显示
1. 用法示例
1.1 单个关键字查询
$ psgrep redis
[1] zongf 31685 1311 0 13:37 ? 00:00:00 redis-server 127.0.0.1:7481 [cluster]
[2] zongf 31690 1311 0 13:37 ? 00:00:00 redis-server 127.0.0.1:7482 [cluster]
[3] zongf 31695 1311 0 13:37 ? 00:00:00 redis-server 127.0.0.1:7483 [cluster]
1.2 多个关键字查询
$ psgrep 7481 7482 7483
[1] zongf 31685 1311 0 13:37 ? 00:00:00 redis-server 127.0.0.1:7481 [cluster]
[2] zongf 31690 1311 0 13:37 ? 00:00:00 redis-server 127.0.0.1:7482 [cluster]
[3] zongf 31695 1311 0 13:37 ? 00:00:00 redis-server 127.0.0.1:7483 [cluster]
2. 命令源码
use warnings
;
use Term
::ANSIColor
qw(:constants);
$Term::ANSIColor::AUTORESET = 1;
sub check_help{
my $param = $ARGV[0];
if("-h" eq $param || "--help" eq $param){
print BOLD BLUE
"Desc: "; print "查看当前正在运行的进程,可查询多个,基于命令: ps -ef | grep ...\n";
print BOLD BLUE
"Args: "; print "筛选字符串\n";
print BOLD BLUE
"Exam: "; print "psgrep redis tomcat\n";
print BOLD BLUE
"Auth: "; print "zonggf\n";
print BOLD BLUE
"Date: "; print "2016-12-30\n";
exit
;
}
}
sub print_color(){
if(@_ < 2){
print shift
@_;
return
;
}
my $line = shift
@_;
my @patterns = @_;
my $spectors = (shift
@_) . '+';
foreach(@_){
$spectors .= "|$_+";
}
my @arrays = split
(/($spectors)/, $line);
for my $item(@arrays){
my $pattern = "@patterns";
my $idx = index
($pattern, $item);
if($idx > -1){
print BOLD RED
$item;
}else{
print $item;
}
}
}
sub fmt_idx{
return shift
@_ if @_ < 2;
my ($str, $array_length) = @_;
my $length = length
$array_length;
return sprintf
"[%-${length}s] ", $str;
}
&check_help;
@patterns = @ARGV;
$ports .= shift
@ARGV;
foreach (@ARGV){
$ports .="|$_";
}
$ps_cmd = 'ps -ef | grep -v /usr/bin/perl | grep -v "grep -E" ';
$ps_cmd .= " | grep -E \"" . $ports ."\"" if defined
$ports;
@lines = `$ps_cmd`;
foreach $idx (1 .. @lines){
print BOLD GREEN
"[" . $idx . "] ";
&print_color($lines[$idx-1] ,@patterns);
}