I'd need to extract the value of a variable "error" from a log file. Here's a sample line:
WARN (Periodic Recovery) IJ000906: error=15 check server.log
I'd need to capture the value of "error". Looking on similar answers, I've come up with:
echo "WARN (Periodic Recovery) IJ000906: error=15 check server.log" | grep -P '\d (error=?)' -o
However it does not produce any value. Can you recommend a working solution for this case?
CodePudding user response:
Using sed
$ echo "WARN (Periodic Recovery) IJ000906: error=15 check server.log" | sed 's/.*error=\([^ ]*\).*/\1/'
15
CodePudding user response:
For a perl-compatible regular expression, you're looking for a "lookbehind" assertion.
To find digits that are preceded by the string "error=", you want:
echo "$line" | grep -o -P '(?<=error=)\d ' # => 15
See the pcresyntax(3)
man page
CodePudding user response:
You may use this grep
:
s='WARN (Periodic Recovery) IJ000906: error=15 check server.log'
grep -oP '\d : error=\K\d ' <<< "$s"
15
RegEx Details:
\d :
: Match 1 digits followed by colon and spaceerror=
: Matcherror=
text\K
: Reset matched info\d
: Match 1 digits and print it
CodePudding user response:
I would use GNU AWK
following way, let file.txt
content be
WARN (Periodic Recovery) IJ000906: error=15 check server.log
then
awk 'BEGIN{FPAT="error=[0-9] "}{print substr($1,7)}' file.txt
output
15
Explanation: I inform GNU AWK that column is error=
followed by 1 or more digits using field pattern (FPAT
), for every line print first field starting from 7th charater, using substr
string function. 7
as error=
has 6 characters. Note: this solution will print first occurence of error=
value for each line.
(tested in gawk 4.2.1)
CodePudding user response:
With bash
>= 3.0.
v='WARN (Periodic Recovery) IJ000906: error=15 check server.log'
[[ $v =~ error=([0-9] ) ]] && echo "${BASH_REMATCH[1]}"
Output:
15