linux 工具 -- confview

通常情况下, linux 下的配置文件会有很多注释, 注释通常是由#开头的. 当我们去查看配置文件内容时, 会被大量的注释干扰到, 不能对所有配置有一个整体的把控.因此我们需要一个能自动过滤空行和注释行, 并能对关键字高亮显示的工具. 因此, 笔者就写了一个专门看配置文件内容的工具.此工具虽然局限性有点儿大, 但确实非常好用的一个小工具.

1. 工具特色

  • 自动过滤空行和以#开头的注释行
  • 高亮显示多个关键字
  • 显示真实行号

2. confview 开发

2.1 源程序 confview.pl

#!/usr/bin/perl
#Desc  查看配置文件, 默认过滤#开头的注释行和空行, 可添加选项-a 不过滤或添加 -n 不显示行号
#Auth  zonggf
#Date  2017-07-15

use Term::ANSIColor qw(:constants);
$Term::ANSIColor::AUTORESET = 1;

######################################## 子程序  ########################################
#打印注释信息
sub print_help{
    #获取标签和注释
    my($tag) = shift @_;
    my($cmt) = shift @_;
    #输出第一行注释
    print BOLD BLUE "$tag: ";
    print "$cmt\n";
    #输出其它的注释
    printf "%5s $_\n","" foreach @_;
}

#检查是否是查询帮助
sub check_help{
  my $param = $ARGV[0];
  if("-h" eq $param || "--help" eq $param){
        &print_help("Desc","查看配置文件并高亮显示关键字, 默认过滤#开头的注释行和空行, 可添加选项-a 不过滤");
        &print_help("Args","-a 可选参数, 不过滤空号和注释号",
                        "-n 隐藏行号, 和-a 不能同时使用,只能使用一个",
                        "配置文件名称",
                        "筛选关键字,可同时输入多个关键字, 关键字直接用空格隔开, 多个关键字直接为或的关系");
        &print_help("Exam","confview /etc/udev/rules.d/70-persistent-net.rules eth0 add: 过滤空行,注释行,高亮显示eth0 add,显示行号",
                 "confview -a /etc/udev/rules.d/70-persistent-net.rules eth0 add: 不过滤空行,注释行,高亮显示关eth0 add,显示行号",
                 "confview -n /etc/udev/rules.d/70-persistent-net.rules eth0 add: 过滤空行,注释行,高亮显示关eth0 add,不显示行号" );
        &print_help("Auth","zongf");
        &print_help("Date","2017-07-15");

    exit;
  }elsif ("-a" eq $param){
    #显示所有, 不过滤空行和注释行
    $show_all = 1;
    shift @ARGV;
  }elsif ("-n" eq $param){
    #不显示行号
    $hide_number = 1;
    shift @ARGV;
  }
  # 检测是否有配置文件名 
  if( -1 == $#ARGV ){
      print BOLD RED "[error] "; print "请输入要查看的配置文件名\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;

#配置文件名称
$file_name = shift @ARGV;

#读取文件内容,获取文件行数
open $f_cfg, "<", $file_name or die "[错误] $file_name not exists !!\n";
@lines = <$f_cfg>;
$lines_length = @lines;

#遍历文件内容
for $idx (1 .. @lines){
   $line = $lines[$idx];

   #如果是空行或者注释行
   if($line =~ /^$|^\s*#/){
      if(defined $show_all){
        print BOLD GREEN &fmt_idx($idx,$lines_length);
        &print_color($line ,@ARGV);
      }
   }else{
       #当show_numer 为1 时, 不输出行号
       print BOLD GREEN &fmt_idx($idx,$lines_length) unless $hide_number == 1;
       &print_color($line ,@ARGV);
       #记录总行数
       $rs_cnt++;
   }
}

#打印配置文件总行数
print BOLD CYAN "\nEffective Lines: $rs_cnt; Total Lines: $lines_length\n";

#关闭文件流
close $f_cfg;

2.2 加密为二进制程序

  • 使用笔者自己开发的perl2bin 工具将源文件加密为二进制程序, 并删除源程序
  • 将二进制程序pskill 移动到某个环境变量目录, 笔者设置的环境变量目录为: /usr/local/bin/perl/
[admin@localhost perl]$ ls
confview.pl
[admin@localhost perl]$ perl2bin confview.pl 
开始转换脚本:confview.pl
[admin@localhost perl]$ mv confview /usr/local/bin/perl/

3. 测试

3.1 获取帮助信息

  • 使用-h 或 --help 选项获取命令的帮助信息
[admin@localhost perl]$ ./confview.pl -h
Desc: 查看配置文件并高亮显示关键字, 默认过滤#开头的注释行和空行, 可添加选项-a 不过滤
Args: -a 可选参数, 不过滤空号和注释号
      -n 隐藏行号, 和-a 不能同时使用,只能使用一个
      配置文件名称
      筛选关键字,可同时输入多个关键字, 关键字直接用空格隔开, 多个关键字直接为或的关系
Exam: confview /etc/udev/rules.d/70-persistent-net.rules eth0 add: 过滤空行,注释行,高亮显示eth0 add,显示行号
      confview -a /etc/udev/rules.d/70-persistent-net.rules eth0 add: 不过滤空行,注释行,高亮显示关eth0 add,显示行号
      confview -n /etc/udev/rules.d/70-persistent-net.rules eth0 add: 过滤空行,注释行,高亮显示关eth0 add,不显示行号
Auth: zongf
Date: 2017-07-15
[admin@localhost perl]$ ./confview.pl --help
Desc: 查看配置文件并高亮显示关键字, 默认过滤#开头的注释行和空行, 可添加选项-a 不过滤
Args: -a 可选参数, 不过滤空号和注释号
      -n 隐藏行号, 和-a 不能同时使用,只能使用一个
      配置文件名称
      筛选关键字,可同时输入多个关键字, 关键字直接用空格隔开, 多个关键字直接为或的关系
Exam: confview /etc/udev/rules.d/70-persistent-net.rules eth0 add: 过滤空行,注释行,高亮显示eth0 add,显示行号
      confview -a /etc/udev/rules.d/70-persistent-net.rules eth0 add: 不过滤空行,注释行,高亮显示关eth0 add,显示行号
      confview -n /etc/udev/rules.d/70-persistent-net.rules eth0 add: 过滤空行,注释行,高亮显示关eth0 add,不显示行号
Auth: zongf
Date: 2017-07-15

3.2 显示配置文件全部内容, 并高亮显示

  • 查看配置文件全部内容, 并显示行号, 高亮eth0 和 add 关键字
[admin@localhost perl]$ confview -a /etc/udev/rules.d/70-persistent-net.rules eth0 add 
[1] # program, run by the persistent-net-generator.rules rules file.
[2] #
[3] # You can modify it, as long as you keep each rule on a single
[4] # line, and change only the value of the NAME= key.
[5] 
[6] # PCI device 0x8086:0x100f (e1000)
[7] SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:5c:71:36", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
[8] 
Effective Lines: 1; Total Lines: 8

3.3 显示配置文件内容, 过滤空行和注释

  • 查看配置文件, 过滤空行和以#开头的注释行,高亮关键字add 和 eth0, 显示行号
[admin@localhost perl]$ confview /etc/udev/rules.d/70-persistent-net.rules eth0 add   
[7] SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:5c:71:36", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

Effective Lines: 1; Total Lines: 8

3.4 显示配置文件内容, 过滤空行和注释, 但不显示行号

  • 查看配置文件,过滤空行和以#开头的注释行, 高亮关键字add 和 eth0, 不显示行号
[admin@localhost perl]$ confview -n /etc/udev/rules.d/70-persistent-net.rules eth0 add
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:5c:71:36", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

Effective Lines: 1; Total Lines: 8

results matching ""

    No results matching ""