需要分析许多服务器日志。每条日志消息都是一个字符串,我正在循环这些叮当声。
问题:
我需要查看字符串是否与模式匹配
某些文字 作业 * some_one_word_name * 已完成,状态 更多文字
我需要在单词作业和已完成之间保存单词。在这种特殊情况下(见下文),我会保存 EgiMmsWellHdr
Seq_Loading_SOR_to_Landing..JobControl (DSWaitForJob): Job EgiMmsWellHdr has finished, status = 1 (Finished OK)
答案 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-z
和A-Z
的简写。
我可以使用<<<
间接文件,而不是我使用的< filename
。