获取某个单词后的子字符串

时间:2014-03-28 09:28:15

标签: bash shell parsing

字符串如下所示:

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)

3 个答案:

答案 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]因为我太懒了,无法找到与换行符的明确匹配。这可以改善。

bashksh93

中进行了测试

答案 2 :(得分:0)

grep -A1 Message | tail -1应该做到这一点。 -A1告诉grep在找到匹配时再向输出写入一行(1之后)。