27. Perl 脚本实战-psgrep

    xiaoxiao2022-07-04  175

    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. 命令源码

    #!/usr/bin/perl #Desc 查询正在运行的进程 #Auth zongf #Date 2016-12-30 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; } } #desc 输出有颜色的字符串 #para1 接收至少两个参数以上,第一个参数为要格式化的字符串,之后的参数为要使用颜色的字符串 sub print_color(){ # 如果长度小于2, 那么不进行格式化输出,直接打印 if(@_ < 2){ print shift @_; return; } #获取要格式化颜色的字符串 my $line = shift @_; #获取要高亮的字符串数组 my @patterns = @_; #获取要高亮显示的字符串数组,拼接正则模式 my $spectors = (shift @_) . '+'; foreach(@_){ $spectors .= "|$_+"; } #按正则模式进行分组 my @arrays = split(/($spectors)/, $line); #输出结果 for my $item(@arrays){ #直接使用@patterns 数组反向匹配,数组内插时,每个字符串直接会有空格 my $pattern = "@patterns"; #字符串中查找元素,如果有的话则高亮显示,否则正常显示 my $idx = index($pattern, $item); if($idx > -1){ print BOLD RED $item; }else{ print $item; } } } #格式化索引长度 #参数: 接收两个参数 # para1: 需要格式化的索引 # para2: 数组长度 #返回: [1 ] 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); }
    最新回复(0)