字符串如下所示:
Event Id: 971
Time : Fri Mar 28 03:50:03 2014
Type : INFO
User : ehwe
Message :
Oracle_Connector_1,0: Number of rows fetched on the current node: 0.
我需要获取消息后面的子字符串:。所以我在这种情况下需要这个 Oracle_Connector_1,0:当前节点上提取的行数:0。
我尝试使用b=${a%'Message :'*}
格式,但这并没有帮助。
请帮忙吗?
更新
某些日志条目可能类似于下一条:
Event Id: 970
Time : Fri Mar 28 03:50:03 2014
Type : FATAL
User : ehwe
Message :
Oracle_Connector_1,0: [IIS-CONN-ORA-001003] The OCI function OCIStmtExecute returned status -1. Error code: 6,550, Error message: ORA-06550: line 2, column 14:
PLS-00201: identifier 'IT' must be declared
ORA-06550: line 2, column 14:
PL/SQL: Item ignored
ORA-06550: line 5, column 5:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 5, column 5:
PL/SQL: Statement ignored
ORA-06550: line 8, column 26:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 8, column 7:
PL/SQL: Statement ignored. (CC_OraStatement::executePlSql, file CC_OraStatement.cpp, line 2,746)
答案 0 :(得分:2)
您可以使用:
awk 'f; /Message/ {f=1}' file
f
,则条件为真,因此awk
会打印该行。Message
出现时,标记f
都会设置为1. 如果您想在Message
发生后准确打印该行,您可以执行以下操作:
$ awk 'f {print; exit} /Message/ {f=1}' file
Oracle_Connector_1,0: [IIS-CONN-ORA-001003] The OCI function OCIStmtExecute returned status -1. Error code: 6,550, Error message: ORA-06550: line 2, column 14:
与上述相同,只是在第一次打印后,它停止读取文件并exits
。
要将变量用作输入而不是文件,请使用:
awk 'f {print; exit} /Message/ {f=1}' <<< "$var"
查看示例:
$ echo "$var"
hello
how are you
$ awk '1' <<< "$var"
hello
how are you
答案 1 :(得分:1)
我希望${a%'Message :'*}
返回第一行四行。如果$a
包含上述整条消息,请撤消匹配:
a="Event Id: 971
Time : Fri Mar 28 03:50:03 2014
Type : INFO
User : ehwe
Message :
Oracle_Connector_1,0: Number of rows fetched on the current node: 0."
echo "${a#*Message :[$IFS]}"
输出:
Oracle_Connector_1,0: Number of rows fetched on the current node: 0.
注意:
使用[$IFS]
因为我太懒了,无法找到与换行符的明确匹配。这可以改善。
在bash
和ksh93
答案 2 :(得分:0)
grep -A1 Message | tail -1
应该做到这一点。 -A1告诉grep在找到匹配时再向输出写入一行(1之后)。