从字符串中解析名称

时间:2014-04-09 12:55:05

标签: bash shell parsing

需要分析许多服务器日志。每条日志消息都是一个字符串,我正在循环这些叮当声。

问题:

我需要查看字符串是否与模式匹配

某些文字 作业 * some_one_word_name * 已完成,状态 更多文字

我需要在单词作业已完成之间保存单词。在这种特殊情况下(见下文),我会保存 EgiMmsWellHdr

 Seq_Loading_SOR_to_Landing..JobControl (DSWaitForJob): Job EgiMmsWellHdr has finished, status = 1 (Finished OK)

4 个答案:

答案 0 :(得分:2)

使用gnu grep

grep -oP ": Job \K.*(?=has finished)" log.file

EgiMmsWellHdr

grep -oP "(?<=: Job ).*(?=has finished)" file

似乎你不支持-P和-o选项,试试这个sed命令

sed -n 's/.*: Job \(.*\) has finished.*/\1/p' file

答案 1 :(得分:2)

您可以使用awk:

s='Job EgiMmsWellHdr has finished'
awk -F 'Job | has finished' '{print $2}' <<< "$s"
EgiMmsWellHdr

使用纯BASH:

[[ "$s" =~ "Job "([^[:blank:]]+)" has finished" ]] && echo ${BASH_REMATCH[1]}
EgiMmsWellHdr

答案 2 :(得分:0)

试试这个,

[root@server1]# str="Seq_Loading_SOR_to_Landing..JobControl (DSWaitForJob): Job EgiMmsWellHdr has finished, status = 1 (Finished OK)"
[root@server1]# echo $str | cut -d ":" -f2 | cut -f3 -d " "
EgiMmsWellHdr

答案 3 :(得分:0)

使用bash正则表达式:

re="Job (\w+) has finished" 
while read line
do 
    [[ "$line" =~ $re ]] && echo "${BASH_REMATCH[1]}"
done <<<"Seq_Loading_SOR_to_Landing..JobControl (DSWaitForJob): Job EgiMmsWellHdr has finished, status = 1 (Finished OK)"

输出:

EgiMmsWellHdr

\w是字符a-zA-Z的简写。 我可以使用<<<间接文件,而不是我使用的< filename