1

我想10.2.0.4.0从 AIX 中的 tnsping 输出中获取,所以我写了tnsping tucson | grep Version | awk '{print $9}',但有时在 Linux 等其他平台上,列会有所不同,所以我不能{print $9}到处使用。有没有这样的方法

  1. 该命令寻找Version
  2. 然后在它打印出现的任何数字之后(包括“。”)

还是有什么其他方法?

TNS Ping Utility for IBM/AIX RISC System/6000: Version 10.2.0.4.0 - Production on 16-NOV-2011 16:19:02

Copyright (c) 1997,  2007, Oracle.  All rights reserved.

Used parameter files:

Used HOSTNAME adapter to resolve the alias
Attempting to contact (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=bluebird.informatica.com))(ADDRESS=(PROTOCOL=TCP)(HOST=10.65.40.235)(PORT=1521)))
TNS-12535: TNS:operation timed out

我为 AIX、HPUX 和 Linux 获得了它:

tnsping tucson | grep Version | awk -F Version  '{print $2}' | awk '{print $1}'

但是我在SunOS上遇到了一个错误,我想要一些可以在 Linux、HP-UX、AIX 和 SunOS 上运行的东西。

zenvo%  tnsping tucson | grep Version | awk -F Version  '{print $2}' | awk '{print $1}'
awk: syntax error near line 1
awk: bailing out near line 1

庇护所回答后更新

Linux、AIX 和 HP-UX:

tnsping tucson | grep Version | awk -F Version  '{print $2}' | awk '{print $1}'

太阳操作系统:

tnsping tucson | grep Version | nawk -F Version  '{print $2}' | nawk '{print $1}'
4

2 回答 2

1

Solaris 上的 AWK 是旧的 AWK。通常,Solaris 用户使用 nawk 来获得“新”AWK 的好处。

我不认为旧的 AWK 支持多字符值作为您定义的字段分隔符-F Version(好技巧!)。如果幸运的话,在该值周围添加引号可能会解决问题。

更有可能的是,在 Solaris 上运行时,您必须使脚本智能分配 nawk。

就像是

case $( uname -a ) in
    *Solaris* ) awk=nawk ;;
    * ) awk=awk
esac

tnsping tucson | grep Version | ${awk} -F "Version"  '{print $2}' | ${awk} '{print $1}'

应该做的伎俩。我无法再访问 Solaris 系统,所以我无法验证这是否可行,但如果它不能正常工作,我会感到惊讶。

嗯,现在我过去的一些事情告诉我,即使是 Solaris 上的 nawk 也不像 FieldSeps 那样喜欢字符串。也许您可以安装 awksome gawk 或其他解决方案(看来您正在那里),只是

tnsping tucson | ${awk} '/Version/ {sub(/,*Version /, "", $0) ; sub(/.*$/, "", $0); print $0; exit}'

无论如何,您都应该减少到您的版本号。此外,使用 AWK 中的“/Version/”过滤器,您不需要介于两者之间的 grep,并且我们消除了对 AWK 的额外调用。

我希望这有帮助。

于 2011-11-18T21:12:09.437 回答
1

请尝试使用sed

tnsping tucson |
sed -n '/Version/{                                                       # Grep like
    s@.* Version \([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*@\1@i  # Substitution with @ separator
    p;                                                                   # Print
    q;                                                                   # quit
}'
于 2011-11-18T21:40:43.737 回答