我想从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
Shelter的回答后更新
Linux,AIX和HP-UX:
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}'
答案 0 :(得分: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那样喜欢字符串。也许你可以安装令人难以置信的gawk或其他解决方案(看起来你正在那里),只是
tnsping tucson | ${awk} '/Version/ {sub(/,*Version /, "", $0) ; sub(/.*$/, "", $0); print $0; exit}'
无论如何,你应该减少你的版本号。此外,使用AWK中的'/ Version /'过滤器,您不需要在两者之间使用grep,我们已经消除了对AWK的额外调用。
我希望这会有所帮助。
答案 1 :(得分: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
}'