【问题标题】:Adding an || regex to a bash ``ed one-liner in a perl script添加一个 ||正则表达式到 perl 脚本中的 bash `ed one-liner
【发布时间】:2016-10-28 17:22:47
【问题描述】:

我正在尝试添加 ||将正则表达式转换为 perl 脚本中的 bash `ed one-liner,如果这有意义的话。

my $result = `df -H | grep -vE '^Filesystem|tmpfs|cdrom|none'  | awk '{ print \$1 "\t" \$5 " used."}'`; 

# .Private maybe the same as /dev/sdb1 so I'm trying to remove it too 
# by trying to add || (m/\.Private/) to the above

print  "$result";

因此,我目前正在从输出中删除以 Filesystem、tmpfs、cdrom 或无开头的行,但如果可能的话,我也希望将“或包含 .Private 的行”添加到单行中。 .

我也有下面的,但想用上面的代码重现它的结果......

my @result2 =Shell::df ("-H"); 
shift @result2;   # get rid of "Filesystem..."
for( @result2 ){
next if ((/^tmpfs|tmpfs|cdrom|none/) || (m/\.Private/));
my @words2 = split('\s+', $_);
print $words2[0], "\t", $words2[4], " used\.\n";
}

【问题讨论】:

标签: linux perl bash


【解决方案1】:

我建议您完全摆脱“awk”部分。从 perl 内部调用 awk 是愚蠢的。

相反,依靠使用列表上下文捕获行,然后在 perl 中进行处理。

my @lines = df -H;

我的@results = grep ... @lines; # perl 'grep' 内置

如果您坚持使用 unix grep,为什么不在您的 grep 排除模式中添加“|.Private”?

【讨论】:

    【解决方案2】:

    您只需将\.Private 部分添加到当前正则表达式中:

    grep -vE '^Filesystem|tmpfs|cdrom|none|\.Private'
    

    附带说明,模式^Filesystem|tmpfs|cdrom|none 可能实际上并不能满足您的要求,因为只有Filesystem 在行首匹配,如果其他部分出现在输入中的任何位置,它们将被匹配。要在开头匹配它们,请将其更改为:

    '^Filesystem|^tmpfs|^cdrom|^none'
    

    【讨论】:

      【解决方案3】:

      您的正则表达式并没有按照您的想法执行。它匹配以Fileystem 开头或在任何地方包含其他单词的字符串。

      试试这个:

      grep -vE '^(Filesystem|tmpfs|cdrom|none)|\.Private'
      

      【讨论】:

        【解决方案4】:

        像这样?

        my $result = `df -H | grep -vE '(^Filesystem|tmpfs|cdrom|none)|\.Private'  | awk '{ print \$1 "\t" \$5 " used."}'`; 
        

        【讨论】:

          猜你喜欢
          • 2011-01-22
          • 2016-11-22
          • 2014-03-20
          • 2014-07-31
          • 2015-09-06
          • 2011-11-01
          • 2013-06-06
          • 1970-01-01
          相关资源
          最近更新 更多