首页 > 解决方案 > 从命令输出中提取 powershell 中的所需字段

问题描述

我正在编写一个powershell脚本,作为其中的一部分,我需要找出目标机器的Linux风格,并根据我得到的风格,我需要随后执行命令。

要知道 linux 类型,我执行了命令:

cat /etc/os-release

一个示例输出如下所示:

NAME="Red Hat Enterprise Linux Server" VERSION="7.6 (Maipo)" ID="rhel" ID_LIKE="fedora" VARIANT="Server" VARIANT_ID="server" VERSION_ID="7.6" PRETTY_NAME="Red Hat Enterprise Linux服务器 7.6 (Maipo)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:redhat:enterprise_linux:7.6:GA:server" HOME_URL="https://www.redhat.com/" BUG_REPORT_URL="https ://bugzilla.redhat.com/" REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Li nux 7" REDHAT_BUGZILLA_PRODUCT_VERSION=7.6 REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux" REDHAT_SUPPORT_PRODUCT_VERSION="7.6"

我需要获取输出的NAME="Red Hat Enterprise Linux Server"或更具体地说是Red Hat Enterprise Linux Server部分。同样, NAME=部分中的输出可能是 Debian 或 CentOS 或 SUSE 。

如果 $output 是上述输出的全部,我尝试了以下操作:

  1. $output.NAME
  2. $abc = -split $Output; Write-Host $abc[0] + $abc[1]
  3. findstr
  4. Select-String 还有更多的东西

但它们都不起作用。有人可以帮忙吗?

标签: windowspowershell

解决方案


正则表达式的一种方法是这样做,另一种方法是使用ConvertFrom-String可以提供模板的选项。例如。

$Template = 'NAME="{Name:Red Hat Enterprise Linux Server}" VERSION="7.6 (Maipo)" ID="rhel" ID_LIKE="fedora" VARIANT="Server" VARIANT_ID="server" VERSION_ID="7.6" PRETTY_NAME="Red Hat Enterprise Linux Server 7.6 (Maipo)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:redhat:enterprise_linux:7.6:GA:server" HOME_URL="https://www.redhat.com/" BUG_REPORT_URL="https://bugzilla.redhat.com/"  REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 7" REDHAT_BUGZILLA_PRODUCT_VERSION=7.6 REDHAT_SUPPORT_PRODUCT="Red Hat Eterprise Linux" REDHAT_SUPPORT_PRODUCT_VERSION="7.6"'

$TestData = 'NAME="Red Hat Enterprise Linux Server" VERSION="7.6 (Maipo)" ID="rhel" ID_LIKE="fedora" VARIANT="Server" VARIANT_ID="server" VERSION_ID="7.6" PRETTY_NAME="Red Hat Enterprise Linux Server 7.6 (Maipo)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:redhat:enterprise_linux:7.6:GA:server" HOME_URL="https://www.redhat.com/" BUG_REPORT_URL="https://bugzilla.redhat.com/"  REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 7" REDHAT_BUGZILLA_PRODUCT_VERSION=7.6 REDHAT_SUPPORT_PRODUCT="Red Hat Eterprise Linux" REDHAT_SUPPORT_PRODUCT_VERSION="7.6"'
$TestData2 = 'NAME="Ubuntu" VERSION="20.04 (Maipo)" ID="debian" ID_LIKE="fedora" VARIANT="Server" VARIANT_ID="server" VERSION_ID="7.6" PRETTY_NAME="Red Hat Enterprise Linux Server 7.6 (Maipo)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:redhat:enterprise_linux:7.6:GA:server" HOME_URL="https://www.redhat.com/" BUG_REPORT_URL="https://bugzilla.redhat.com/"  REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 7" REDHAT_BUGZILLA_PRODUCT_VERSION=7.6 REDHAT_SUPPORT_PRODUCT="Red Hat Eterprise Linux" REDHAT_SUPPORT_PRODUCT_VERSION="7.6"'
$TestData3 = 'NAME="Centos" VERSION="7.654 (Maipo)" ID="rhel" ID_LIKE="fedora" VARIANT="Server" VARIANT_ID="server" VERSION_ID="7.6" PRETTY_NAME="Red Hat Enterprise Linux Server 7.6 (Maipo)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:redhat:enterprise_linux:7.6:GA:server" HOME_URL="https://www.redhat.com/" BUG_REPORT_URL="https://bugzilla.redhat.com/"  REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 7" REDHAT_BUGZILLA_PRODUCT_VERSION=7.6 REDHAT_SUPPORT_PRODUCT="Red Hat Eterprise Linux" REDHAT_SUPPORT_PRODUCT_VERSION="7.6"'
$TestData4 = 'NAME="Arch Linux" VERSION="24.6 (Maipo)" ID="rhel" ID_LIKE="fedora" VARIANT="Server" VARIANT_ID="server" VERSION_ID="7.6" PRETTY_NAME="Red Hat Enterprise Linux Server 7.6 (Maipo)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:redhat:enterprise_linux:7.6:GA:server" HOME_URL="https://www.redhat.com/" BUG_REPORT_URL="https://bugzilla.redhat.com/"  REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 7" REDHAT_BUGZILLA_PRODUCT_VERSION=7.6 REDHAT_SUPPORT_PRODUCT="Red Hat Eterprise Linux" REDHAT_SUPPORT_PRODUCT_VERSION="7.6"'
$TestData,$TestData2,$TestData3,$TestData4 | 
    ForEach-Object { 
        $_ | 
        ConvertFrom-String -TemplateContent $Template
    }

输出:

Name
----
Red Hat Enterprise Linux Server
Ubuntu
Centos
Arch Linux

编辑:这是一个正则表达式变体:

$Regex = '.*="(.*)"\sVERSION='
$TestData,$TestData2,$TestData3,$TestData4 |
    ForEach-Object {
        [void]($_ -match $Regex)
        $Matches.1
    }

输出:

Red Hat Enterprise Linux Server
Ubuntu
Centos
Arch Linux

推荐阅读