是否有一个Bash等同于PowerShell的CmdLets,它充当管道过滤器?

时间:2016-11-10 23:22:36

标签: linux bash powershell filter pipeline

我有一个程序将文本输出写入STDOUT。我想过滤和着色这些输出。在PowerShell中,我编写了一个CmdLet,它解析文本行并将它们发送到控制台,并根据需要为某些部分着色。 Example

在PowerShell中,我有这样一个功能:

function Write-ColoredProgLine
{ [CmdletBinding()]
  param(
    [Parameter(ValueFromPipeline=$true)]
    $InputObject,

    [Parameter(Position=1)]
    [switch]$SuppressWarnings = $false,
    [Parameter(Position=2)]
    [string]$Indent = ""
  )

  begin
  { $ErrorRecordFound = $false  }

  process
  { if (-not $InputObject)
    { Write-Host "Empty pipeline!"  }
    elseif ($InputObject -is [string])
    { if ($InputObject.StartsWith("vlib "))
      { Write-Host "${Indent}$InputObject" -ForegroundColor Gray   }  }
      elseif ($InputObject.StartsWith("** Warning:") -and -not $SuppressWarnings)
      { Write-Host "${Indent}WARNING: " -NoNewline -ForegroundColor Yellow
        Write-Host $InputObject.Substring(12)
      }
      elseif ($InputObject.StartsWith("** Error:") -and -not $SuppressWarnings)
      { $ErrorRecordFound += 1
        Write-Host "${Indent}WARNING: " -NoNewline -ForegroundColor Yellow
        Write-Host $InputObject.Substring(12)
      }
    }
    else
    { Write-Host "Unsupported object in pipeline stream"   }
  }

  end
  { $ErrorRecordFound   }
}

用法:

$expr = "prog.exe -flag -param foo"
$errors = Invoke-Expression $expr | Write-ColoredProgLine $false "  "

如何在Bash中处理此类操作?

我在过滤器脚本中需要某种内部状态,因此像GRC这样的工具不够强大。

2 个答案:

答案 0 :(得分:2)

以下是与POSIX兼容的方法:

awk '
/vlib/ {
  $0 = "\33[1;36m" $0 "\33[m"
}
/warning/ {
  $0 = "\33[1;33m" $0 "\33[m"
}
1
'

结果:

  

console screenshot

应该注意,您无法使用POSIX Sed。虽然它是 诱人的,POSIX Sed没有办法在这里创建所需的转义序列 POSIX Awk确实如此。

答案 1 :(得分:0)

您可以在管道中使用sed。也许它不是最简单的工具,但非常强大。你可以用替换命令做很多事情:

echo test | sed -e 's/es/ES/'

输出:

tESt

这也可以用于通过替换来删除一些模式:

sed -e 's/pattern//'

并为您的模式添加前缀/后缀(&是您的匹配):

sed -e 's/pattern/PREFIX&SUFFIX/'

对于着色语法,请检查以下链接: http://ascii-table.com/ansi-escape-sequences.php

但是如果你需要保持一些内在状态,那么使用awk

会更容易