我想从AIX中的tnsping输出中获取10.2.0.4.0,因此我编写了tnsping tucson | grep Version | awk '{print $9}',但有时在其他平台(如Linux )中,列会有所不同,因此不能在任何地方使用{print $9}。有没有办法
Version或者其他方法?
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和Linux:
tnsping tucson | grep Version | awk -F Version '{print $2}' | awk '{print $1}'SunOS:
tnsping tucson | grep Version | nawk -F Version '{print $2}' | nawk '{print $1}'发布于 2011-11-18 21:12:09
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。也许你可以尴尬地安装一些gawk或者另一个解决方案(看起来你已经在那里了),只是
tnsping tucson | ${awk} '/Version/ {sub(/,*Version /, "", $0) ; sub(/.*$/, "", $0); print $0; exit}'无论如何,你应该缩减到你的版本号。另外,在AWK中为'/Version/‘设置过滤器时,在中间不需要grep,我们已经消除了对AWK的额外调用。
我希望这能帮到你。
发布于 2011-11-18 21:40:43
请尝试使用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
}'https://stackoverflow.com/questions/8147281
复制相似问题