在 Bash 中使用 shell 脚本从文件解析版本号

Parsing version number from file using shell script in Bash

提问人:TorusWithSprinkles 提问时间:8/11/2023 更新时间:8/11/2023 访问量:80

问:

我正在尝试从目录如下所示的文件中提取版本号:

... /directory/to/java/bin/./java -version

从命令行运行它会产生以下输出:

java version "1.7.0_269"
Java(TM) SE Runtime Environment (build 7.0.8.10 - pkshd34234hsd284842_01(xop4_))
bla bla bla
whole bunch of 
extra info

我只需要提取该版本号 1.7.0_269(特别是 minor/patch(?) 版本“269”)。

我对另一个文件做了一些非常相似的事情,并使用了以下语法:

JAVA_VER=$("/the/directory/to/jversion.sh" | awk -F'java.version:' '{print $2}' | xargs )

这很好用,但由于某种原因不适用于这个(诚然,我对 bash 命令的了解不足,所以我不确定如何正确修改它):

APP_JAVA_VER=$(/the/directory/to/java/bin/./java -version | awk -F'java version' '{print $2}' | xargs)

它只是不输出任何内容。谁能为我指出正确的方向来做到这一点?我看到了很多解决此类问题的不同方法,但我想真正了解我的代码哪里出了问题以及如何修改它。这与它不是.sh文件有关吗?感谢您的帮助!

Linux Bash Shell awk

评论


答:

2赞 tink 8/11/2023 #1

您的问题是输出到 STDERR,而 awk 在 STDIN 上查看。java -version

试试这个:

APP_JAVA_VER=$(/the/directory/to/java/bin/./java -version 2>&1 | awk -F'java version' '{print $2}' | xargs)

评论

0赞 Paolo 8/11/2023
为什么要输出到 stderr?java --version
0赞 tink 8/11/2023
@Paolo 问问 java 开发人员......这就是它在我的系统上所做的。
0赞 Paolo 8/11/2023
哦,是的,你是对的。疯狂
3赞 Ed Morton 8/11/2023
我怀疑 OP 可能只需要或也许而不是.awk -F'"' '{print $2; exit}'awk -F'"' '/java version/{print $2; exit}'awk -F'java version' '{print $2}' | xargs
1赞 TorusWithSprinkles 8/11/2023
谢谢你们俩!仅供其他阅读者参考,这两种解决方案都非常有效。真的很感激