什么" java -version 2>& 1 | awk' NR == 1 {gsub(/" /,"");打印$ 3}'"做?

时间:2016-11-28 16:19:34

标签: bash awk

大家。我一直试图理解脚本的这一行,但我真的无法理解。我是bash脚本的新手,所以这很难:(

java -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }'

我会大量宣传

3 个答案:

答案 0 :(得分:5)

  • java -version 2>&1使用参数java运行-version。这意味着,它告诉Java运行时打印其版本。 2>&1是一个重定向,它使stderr文件描述符(通常用于记录和人类可读文本)写入与stdout相同的目标(通常用于机器解析输出),这样人类可读的文本(例如我们的版本号!)就会通过管道。
  • 竖线字符|将左侧命令的输出连接到右侧命令的输入。
  • awk 'NR==1{ gsub(/"/,""); print $3 }'调用文本处理程序awk,其中包含用于解析输出的程序,该程序执行以下操作:
    • NR == 1表示以下代码仅针对第一行输入
    • 运行
    • gsub(/"/, "")从输入中删除文字双引号。
    • print $3打印给定输入行的第三个字段。

就个人而言,我会写如下:

# uses only bash builtins; first two _s are placeholders for the words we don't care about
IFS=' "' read -r _ _ version < <(java -version 2>&1)

...之后,echo "$version"将发布您的Java版本。

更好,脆弱性更低:

#!/bin/bash
java_version_re='^java version "([^"]+)"'
if [[ $(java -version 2>&1) =~ $java_version_re ]]; then
  version=${BASH_REMATCH[1]}
  echo "Detected java version as $version" >&2
else
  echo "Could not detect java version" >&2
fi

此版本可以检测输出何时正确的Java版本字符串,而原始版本不能。

答案 1 :(得分:1)

最简单的方法是分解部分:

java -version 2&gt;&amp; 1 为您提供java版本:

openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b16)
OpenJDK 64-Bit Server VM (build 25.111-b16, mixed mode)

awk'NR == 1'为您提供第一行:

openjdk version "1.8.0_111"

打印$ 3 为您提供第三个字:

"1.8.0_111"

最后 gsub(/“/,”“)剥离了”charachter:

1.8.0_111

答案 2 :(得分:0)

Awk解析第一行输入,然后删除双引号并打印第三个字段。

Awk是一种自己的编程语言,只是假装它是bash

你不会理解它