Skip to content

Instantly share code, notes, and snippets.

@Tschrock
Last active August 29, 2015 14:04
Show Gist options
  • Save Tschrock/0c6f51a8cbae23b2d5a5 to your computer and use it in GitHub Desktop.
Save Tschrock/0c6f51a8cbae23b2d5a5 to your computer and use it in GitHub Desktop.
Some scripts to maintain and search a personal archive of pocketmine crash reports.
#!/bin/bash
showHelp() {
echo 'Options:
-d DIRECTORY download to a specific directory
(defaults to ~/Documents/pocketmineCrashes)
-h show this help.'
}
DCR_DOWNLOAD_DIRECTORY=~/Documents/pocketmineCrashes
while getopts d:h opt; do
case $opt in
d)
DCR_DOWNLOAD_DIRECTORY=$OPTARG
;;
h)
showHelp
exit
;;
esac
done
cd $DCR_DOWNLOAD_DIRECTORY || {
mkdir -p $DCR_DOWNLOAD_DIRECTORY && cd $DCR_DOWNLOAD_DIRECTORY || {
echo "Error: Couldn't find or make archive location '$DCR_DOWNLOAD_DIRECTORY'"
exit 1
}
echo
}
SPC_LASTARCHIVED=$(ls | grep -o -P "(?<=PMcrash\.)[0-9]*(?=\.json)" | sort -n | tail -1)
[[ "$SPC_LASTARCHIVED" = "" ]] && SPC_LASTARCHIVED=0
echo "Last archived crash is #$SPC_LASTARCHIVED."
if [[ "$SPC_LASTARCHIVED" = "0" ]]; then
echo
echo "Downloading most recent zip archive..."
wget -nv http://home.tschrock.net/PMcrashes.zip -O "PMcrash.zip"
echo "Extracting archive..."
unzip -q PMcrash.zip
echo
SPC_LASTARCHIVED=$(ls | grep -o -P "(?<=PMcrash\.)[0-9]*(?=\.json)" | sort -n | tail -1)
echo "Last archived crash is #$SPC_LASTARCHIVED."
fi
SPC_LASTCRASH=$(wget -qO- http://crash.pocketmine.net/api | grep -o -P "(?<=\"lastId\": ).*")
echo "Most recent crash is #$SPC_LASTCRASH."
if [[ $SPC_LASTARCHIVED -lt $SPC_LASTCRASH ]]; then
echo
echo "Getting new crash reports..."
for ((i=$(( 1 + $SPC_LASTARCHIVED)); i<=$SPC_LASTCRASH; i++)); do
wget -nv http://crash.pocketmine.net/view/$i/api -O "PMcrash.$i.json"
sleep 0.1
done
echo "Retrieved all new crash reports."
fi
echo "Done downloading crash reports."
#!/bin/bash
#
# You need fdupes installed for this one!!!
#
showHelp() {
echo 'Usage: getPMCrashStats.sh [OPTIONS] [EXTRA_STATS...]
Options:
-d DIRECTORY where to look for crash reports.
(defaults to ~/Documents/pocketmineCrashes)
-n CRASH_NUMBER dislpay stats related to this crash report.
-e display stats on common errors
-u display stats on duplicates
-p display stats on common plugins
-m display stats on common namespaces
-c display stats on common classes
-s display stats on operating systems
-t NUMBER when displaying common stats, show the top NUMBER of them. (defaults to 5)
-k include pocketmine classes in common stats
-v VERSION filter by PocketMine version.
-a VERSION filter by api version.
-l ERROR_LEVEL filter by error level. ("error", "warning", "notice", "other")
-h show this help.'
}
SCR_DOWNLOAD_DIRECTORY=~/Documents/pocketmineCrashes
SCR_OPT_n=false
SCR_OPT_e=false
SCR_OPT_p=false
SCR_OPT_m=false
SCR_OPT_v=false
SCR_OPT_a=false
SCR_OPT_l=false
SCR_OPT_c=false
SCR_OPT_t=5
SCR_OPT_k=false
SCR_OPT_u=false
SCR_OPT_s=false
while getopts d:en:pmt:cuskv:a:l:h opt; do
case $opt in
d)
SCR_DOWNLOAD_DIRECTORY=$OPTARG
;;
e)
SCR_OPT_e=true
;;
n)
SCR_OPT_n=$OPTARG
;;
p)
SCR_OPT_p=true
;;
m)
SCR_OPT_m=true
;;
c)
SCR_OPT_c=true
;;
k)
SCR_OPT_k=true
;;
u)
SCR_OPT_u=true
;;
s)
SCR_OPT_s=true
;;
v)
SCR_OPT_v=$OPTARG
;;
a)
SCR_OPT_a=$OPTARG
;;
l)
SCR_OPT_l=$OPTARG
;;
t)
SCR_OPT_t=$OPTARG
;;
h)
showHelp
exit
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
shift $(($OPTIND - 1))
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
$DIR/downloadCrashReports.sh -d $SCR_DOWNLOAD_DIRECTORY
cd $SCR_DOWNLOAD_DIRECTORY &> /dev/null || {
mkdir -p $SCR_DOWNLOAD_DIRECTORY && cd $SCR_DOWNLOAD_DIRECTORY || {
echo "Error: Couldn't find or make archive location '$SCR_DOWNLOAD_DIRECTORY'"
exit 1
}
}
SEARCH_FLAGS=""
[[ !( $SCR_OPT_v = false ) ]] && SEARCH_FLAGS="$SEARCH_FLAGS -v $SCR_OPT_v"
[[ !( $SCR_OPT_a = false ) ]] && SEARCH_FLAGS="$SEARCH_FLAGS -a $SCR_OPT_a"
[[ !( $SCR_OPT_l = false ) ]] && SEARCH_FLAGS="$SEARCH_FLAGS -l $SCR_OPT_l"
grepCrashes(){
if [[ "$SEARCH_FLAGS" = "" ]]; then
$DIR/searchCrashReports.sh -w -p -R -d $(pwd) -q "$1"
else
$DIR/searchCrashReports.sh -w -p -R -d $(pwd) $SEARCH_FLAGS -q "$1"
fi
#grep -P -i --color=always "$1" PMcrash.*.json | sort -V | grep -o -P '(?<=PMcrash\.)[0-9]+(?=\.json.*?:)' | sort -n | uniq
}
filterCrashes(){
echo -en "$1\n$2" | sort -n | uniq -c | awk '{print $2 " " $1}' | sort -n | grep -P '[0-9]+ [0-9]*[2-9]' | awk '{print $1}'
}
getProperty(){
grep -i -P -o "(?<=\"$2\": \").*(?=\")" PMcrash.$1.json
}
GPMCS_REPORTS_ERRORS=$(grepCrashes '("level": "E_ERROR")|("level": "error")')
GPMCS_REPORTS_WARNING=$(grepCrashes '("level": "E_WARNING")')
GPMCS_REPORTS_NOTICE=$(grepCrashes '("level": "E_NOTICE")|("level": "notice")')
GPMCS_REPORTS_OTHER=$(grepCrashes '("level": "E_COMPILE_ERROR")|("level": "E_PARSE")')
getErrors(){
filterCrashes "$1" "$GPMCS_REPORTS_ERRORS" | wc -l
}
getWarnings(){
filterCrashes "$1" "$GPMCS_REPORTS_WARNING" | wc -l
}
getNotices(){
filterCrashes "$1" "$GPMCS_REPORTS_NOTICE" | wc -l
}
getOthers(){
filterCrashes "$1" "$GPMCS_REPORTS_OTHER" | wc -l
}
getSearchStats(){
if [[ "$2" = "" ]]; then
SEARCH=$(echo "$1" | sed -e 's/<|\[space\]|>/ /g')
NAME=$(echo "$1" | sed -e 's/<|\[space\]|>/ /g')
else
NAME=$(echo "$1" | sed -e 's/<|\[space\]|>/ /g')
SEARCH=$(echo "$2" | sed -e 's/<|\[space\]|>/ /g')
fi
GPMCS_TMP=$(grepCrashes "$SEARCH")
GPMCS_TMP2=""
GPMCS_TMP_ER=$(getErrors "$GPMCS_TMP")
if [[ !( "$GPMCS_TMP_ER" = "0" || "$GPMCS_TMP_ER" = "" ) ]];then
GPMCS_TMP2="$GPMCS_TMP_ER errors"
fi
GPMCS_TMP_WN=$(getWarnings "$GPMCS_TMP")
if [[ !( "$GPMCS_TMP_WN" = "0" || "$GPMCS_TMP_WN" = "" ) ]];then
if [[ "$GPMCS_TMP2" = "" ]]; then
GPMCS_TMP2="$GPMCS_TMP_WN warnings"
else
GPMCS_TMP2="$GPMCS_TMP2, $GPMCS_TMP_WN warnings"
fi
fi
GPMCS_TMP_NT=$(getNotices "$GPMCS_TMP")
if [[ !( "$GPMCS_TMP_NT" = "0" || "$GPMCS_TMP_NT" = "" ) ]];then
if [[ "$GPMCS_TMP2" = "" ]]; then
GPMCS_TMP2="$GPMCS_TMP_NT notices"
else
GPMCS_TMP2="$GPMCS_TMP2, $GPMCS_TMP_NT notices"
fi
fi
GPMCS_TMP_OT=$(getOthers "$GPMCS_TMP")
if [[ !( "$GPMCS_TMP_OT" = "0" || "$GPMCS_TMP_OT" = "" ) ]];then
if [[ "$GPMCS_TMP2" = "" ]]; then
GPMCS_TMP2="$GPMCS_TMP_OT others"
else
GPMCS_TMP2="$GPMCS_TMP2, and $GPMCS_TMP_OT others"
fi
fi
if [[ "$GPMCS_TMP" = "" ]]; then
GPMCS_TMP3=0
else
GPMCS_TMP3=$(echo "$GPMCS_TMP" | wc -l)
fi
echo "$NAME: $GPMCS_TMP3 ($GPMCS_TMP2)"
}
getCommonErrors(){
rm -r -f ./dupetest &> /dev/null
mkdir ./dupetest &> /dev/null
cp PMcrash.*.json ./dupetest &> /dev/null
cd ./dupetest &> /dev/null || exit
sed -i -e '2,3d' PMcrash.*.json &> /dev/null
echo
echo "Common Errors:"
echo
sed -i -e '4,7d' PMcrash.*.json &> /dev/null
sed -i -e '12,16d' PMcrash.*.json &> /dev/null
DUPE_ERRORS=$(fdupes -r ./)
DUPE_ERROR_NUMS=$(echo "$DUPE_ERRORS" | sed -e ':a;N;$!ba;s/\.json\n/ /g' -e 's/\.\/PMcrash\.//g' -e 's/\.json//g')
DUPE_NUMS=$(echo "$DUPE_ERROR_NUMS" | awk '{print $1}')
DUPE_NUMS_AND_COUNT=$(echo "$DUPE_ERROR_NUMS" | awk '{print NF ":" $0}' | sed 's/ /{space}/g' | sort -r -V)
DUPE_COUNT=0
for i in $DUPE_NUMS_AND_COUNT; do
let DUPE_COUNT=DUPE_COUNT+1
[[ "$DUPE_COUNT" -gt "$SCR_OPT_t" ]] && break
AMOUNT=$(echo "$i" | sed 's/:.*//g')
CRASHES=$(echo "$i" | sed -e 's/.*://g' -e 's/{space}/ /g')
FIRSTCRASH=$(echo "$CRASHES" | sed -e 's/ .*//g')
echo " "$(getProperty "$FIRSTCRASH" "message")" (#$FIRSTCRASH): $AMOUNT"
done
cd ../
rm -r -f ./dupetest
}
getFiles(){
grep -i -P -o '(?<="file": ").*/src/.*(?=")' PMcrash.*.json | sed -e 's/ /<|space|>/g' -e 's/PMcrash\..*\.json://g' -e 's/^"\//"/g' | sort
}
getCommonNamespaces(){
NAMESPACES=$(getFiles)
[[ $SCR_OPT_k = false ]] && NAMESPACES=$(echo "$NAMESPACES" | grep -v 'src/pocketmine/' | grep -v 'src/spl')
NAMESPACES=$(echo "$NAMESPACES" | sed -e 's/.*\/src\///' | rev | cut -d/ -f2- | rev | sort | uniq -c | sort -nr | sed -e 's/ /<|space|>/g')
echo
echo "Common namespaces:"
echo
TMP_COUNT=0
for i in $NAMESPACES; do
let TMP_COUNT=TMP_COUNT+1
[[ "$TMP_COUNT" -gt "$SCR_OPT_t" ]] && break
AMOUNT=$(echo "$i" | sed -e 's/<|space|>/ /g' -e 's/^ *//' -e 's/ .*//g')
NAMESPACE=$(echo "$i" | sed -e 's/<|space|>/ /g' -e 's/^ *//' -e 's/^[0-9]* //')
echo " $NAMESPACE: $AMOUNT"
done
}
getCommonClasses() {
CLASSES=$(getFiles)
[[ $SCR_OPT_k = false ]] && CLASSES=$(echo "$CLASSES" | grep -v 'src/pocketmine/' | grep -v 'src/spl')
CLASSES=$(echo "$CLASSES" | sed -e 's/.*\/src\///g')
CLASSES=$(echo "$CLASSES" | sort | uniq -c | sort -nr | sed -e 's/ /<|space|>/g')
echo
echo "Common classes:"
echo
TMP_COUNT=0
for i in $CLASSES; do
let TMP_COUNT=TMP_COUNT+1
[[ "$TMP_COUNT" -gt "$SCR_OPT_t" ]] && break
AMOUNT=$(echo "$i" | sed -e 's/<|space|>/ /g' -e 's/^ *//' -e 's/ .*//g')
CLASS=$(echo "$i" | sed -e 's/<|space|>/ /g' -e 's/^ *//' -e 's/^[0-9]* //')
echo " $CLASS: $AMOUNT"
done
}
getCommonPlugins(){
CLASSES=$(getFiles)
CLASSES=$(echo "$CLASSES" | grep -v 'src/pocketmine/' | grep -v 'src/spl')
CLASSES=$(echo "$CLASSES" | sed -e 's/\/src\/.*//' -e 's/^\///g' -e 's/\// /g' | rev | awk '{print $1}' | rev | sed -e 's/ /<|space|>/g' -e 's/.phar//g' -e 's/_v[0-9]*.*//g' -e 's/-[0-9]*\.[0-9]*.*//g' -e 's/<|space|>([0-9]*)//g')
CLASSES=$(echo "$CLASSES" | sort | uniq -c | sort -nr | sed -e 's/ /<|[space]|>/g')
echo
echo "Common plugins:"
echo
TMP_COUNT=0
for i in $CLASSES; do
let TMP_COUNT=TMP_COUNT+1
[[ "$TMP_COUNT" -gt "$SCR_OPT_t" ]] && break
AMOUNT=$(echo "$i" | sed -e 's/<|\[space\]|>/ /g' -e 's/^ *//' -e 's/ .*//g')
PLUGIN=$(echo "$i" | sed -e 's/<|\[space\]|>/ /g' -e 's/^ *//' -e 's/^[0-9]* //' -e 's/<|space|>/ /g')
echo " $PLUGIN: $AMOUNT"
done
}
getCommonHosts() {
#OPERATINGSYSTEMS=$(grep -i -P -o '(?<="os": ").*(?=")' PMcrash.*.json | sed -e 's/PMcrash\..*\.json://g' | sort | uniq -c)
ARCHITECTURES=$(grep -i -P -o '(?<="banner": ").*(?=")' PMcrash.*.json | sed -e 's/PMcrash\..*\.json://g' | awk '{print $1 "<|space|>" $NF}' | sed -e 's/<|space|>/ /g' | sort | uniq -c | sed -e 's/^ *//' -e 's/ /<|[space]|>/g' | sort -nr)
echo
echo Common operating systems:
echo
TMP_COUNT=0
for i in $ARCHITECTURES; do
let TMP_COUNT=TMP_COUNT+1
[[ "$TMP_COUNT" -gt "$SCR_OPT_t" ]] && break
AMOUNT=$(echo "$i" | sed -e 's/<|\[space\]|>/ /g' -e 's/^ *//' -e 's/ .*//g')
HOST=$(echo "$i" | sed -e 's/<|\[space\]|>/ /g' -e 's/^ *//' -e 's/^[0-9]* //')
echo " $HOST: $AMOUNT"
done
}
ALLARGS=""
for ARG in "$@"; do
ARG=$(echo "$ARG" | sed -e 's/ /<|[space]|>/g')
ALLARGS="$ALLARGS $ARG"
done
getCustomStats() {
echo
echo "Custom searches:"
echo
for i in $ALLARGS; do
i=$(echo "$i" | sed -e 's/ /<|[space]|>/g' -e 's/<|>/ /g')
echo " "$(getSearchStats $i)
done
}
echo
echo "-----With exact duplicates-----"
echo
echo "Total crash reports: $(ls PMcrash.*.json | wc -l)"
ARG1="$1"
doSearch(){
[[ "$ARG1" = "" ]] || getCustomStats
[[ $SCR_OPT_m = true ]] && getCommonNamespaces
[[ $SCR_OPT_c = true ]] && getCommonClasses
[[ $SCR_OPT_p = true ]] && getCommonPlugins
[[ $SCR_OPT_s = true ]] && getCommonHosts
[[ $SCR_OPT_e = true ]] && getCommonErrors
}
doSearch
echo
if [[ $SCR_OPT_u = true ]]; then
cd $SCR_DOWNLOAD_DIRECTORY &> /dev/null || exit 1
rm -r -f ./dupetest &> /dev/null
mkdir ./dupetest &> /dev/null
cp PMcrash.*.json ./dupetest &> /dev/null
cd ./dupetest &> /dev/null || exit
sed -i -e '2,3d' PMcrash.*.json &> /dev/null
GPMCS_DUPES=$(fdupes -mrq ./)
echo
echo "**$(echo -n $GPMCS_DUPES | awk '{print $1}') duplicates found. "$(echo $GPMCS_DUPES | grep -o -P '\(.*\)')
echo
echo
echo "-----Without exact duplicates-----"
echo
fdupes -rdN ./ &> /dev/null
echo "Total crash reports: $(ls PMcrash.*.json | wc -l)"
doSearch
echo
cd $SCR_DOWNLOAD_DIRECTORY
rm -r -f ./dupetest
fi
#!/bin/bash
showHelp() {
echo 'Usage: searchCrashReports.sh [OPTION] QUERY
Options:
-d DIRECTORY where to look for crash reports.
(defaults to ~/Documents/pocketmineCrashes)
-w don'"'"'t try downloading new reports
-n CRASH_NUMBER dislpay info from this report instead of searching.
-v VERSION filter by PocketMine version.
-a VERSION filter by api version.
-l ERROR_LEVEL filter by error level. ("error", "warning", "notice", "other")
-R use advanced RegEx.
-e print detailed error information.
-q only print search results.
-f print where match was found.
-p only print result numbers (faster, implies -q, excludes -e -f)
-h show this help.'
}
if [[ "$@" = "" ]]; then
showHelp
exit
fi
SCR_DOWNLOAD_DIRECTORY=~/Documents/pocketmineCrashes
SCR_OPT_v=false
SCR_OPT_a=false
SCR_OPT_l=false
SCR_OPT_e=false
SCR_OPT_q=false
SCR_OPT_f=false
SCR_OPT_n=false
SCR_OPT_w=false
SCR_OPT_p=false
SCR_OPT_R=false
while getopts d:n:v:a:l:cewqpRfh opt; do
case $opt in
d)
SCR_DOWNLOAD_DIRECTORY=$OPTARG
;;
v)
SCR_OPT_v=$OPTARG
;;
a)
SCR_OPT_a=$OPTARG
;;
l)
SCR_OPT_l=$OPTARG
;;
e)
SCR_OPT_e=true
;;
q)
SCR_OPT_q=true
;;
f)
SCR_OPT_f=true
;;
w)
SCR_OPT_w=true
;;
R)
SCR_OPT_R=true
;;
p)
SCR_OPT_p=true
SCR_OPT_q=true
;;
n)
SCR_OPT_n=$OPTARG
;;
h)
showHelp
exit
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
shift $(($OPTIND - 1))
if [[ $SCR_OPT_w = false ]]; then
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
if [[ $SCR_OPT_q = true ]]; then
$DIR/downloadCrashReports.sh -d $SCR_DOWNLOAD_DIRECTORY &> /dev/null
else
$DIR/downloadCrashReports.sh -d $SCR_DOWNLOAD_DIRECTORY
echo
fi
fi
cd $SCR_DOWNLOAD_DIRECTORY &> /dev/null || {
mkdir -p $SCR_DOWNLOAD_DIRECTORY && cd $SCR_DOWNLOAD_DIRECTORY || {
echo "Error: Couldn't find or make archive location '$SCR_DOWNLOAD_DIRECTORY'"
exit 1
}
}
GREP_FLAGS="-i"
[[ $SCR_OPT_R = true ]] && GREP_FLAGS="-i -P"
grepCrashes(){
grep $GREP_FLAGS --color=always "$1" PMcrash.*.json | sort -V | grep -o -P '(?<=PMcrash\.)[0-9]+(?=\.json.*?:)' | sort -n | uniq
}
filterCrashes(){
echo -en "$1\n$2" | sort -n | uniq -c | awk '{print $2 " " $1}' | sort -n | grep -P '[0-9]+ [0-9]*[2-9]' | awk '{print $1}'
}
getProperty(){
grep -i -P -o "(?<=\"$2\": \").*(?=\")" PMcrash.$1.json
}
if [[ !( $SCR_OPT_n = false ) ]]; then
echo "$SCR_OPT_n: "$(getProperty "$SCR_OPT_n" "errorTitle")
echo
echo "level: "$(getProperty "$SCR_OPT_n" "level")
echo "file: "$(getProperty "$SCR_OPT_n" "file")
echo "line: "$(getProperty "$SCR_OPT_n" "line")
echo "message: "$(getProperty "$SCR_OPT_n" "message")
echo
echo
exit
fi
SEARCH_MATCHES=$(grepCrashes "$1")
if [[ !( $SCR_OPT_l = false ) ]];then
if grep -i -q "error" <<<$SCR_OPT_l; then
SCR_FILTER_ERRORS=$(grepCrashes '("level": "E_ERROR")|("level": "error")')
SEARCH_MATCHES=$(filterCrashes "$SEARCH_MATCHES" "$SCR_FILTER_ERRORS")
elif grep -i -q "warning" <<<$SCR_OPT_l; then
SCR_FILTER_WARNING=$(grepCrashes '("level": "E_WARNING")')
SEARCH_MATCHES=$(filterCrashes "$SEARCH_MATCHES" "$SCR_FILTER_WARNING")
elif grep -i -q "notice" <<<$SCR_OPT_l; then
SCR_FILTER_NOTICE=$(grepCrashes '("level": "E_NOTICE")|("level": "notice")')
SEARCH_MATCHES=$(filterCrashes "$SEARCH_MATCHES" "$SCR_FILTER_NOTICE")
elif grep -i -q "other" <<<$SCR_OPT_l; then
SCR_FILTER_OTHER=$(grepCrashes '("level": "E_COMPILE_ERROR")|("level": "E_PARSE")')
SEARCH_MATCHES=$(filterCrashes "$SEARCH_MATCHES" "$SCR_FILTER_OTHER")
fi
fi
if [[ !( $SCR_OPT_v = false ) ]];then
SCR_FILTER_VERSION=$(grepCrashes '"version": "'$SCR_OPT_v'"')
SEARCH_MATCHES=$(filterCrashes "$SEARCH_MATCHES" "$SCR_FILTER_VERSION")
fi
if [[ !( $SCR_OPT_a = false ) ]];then
SCR_FILTER_APIVERSION=$(grepCrashes '"api_version": "'$SCR_OPT_a'"')
SEARCH_MATCHES=$(filterCrashes "$SEARCH_MATCHES" "$SCR_FILTER_APIVERSION")
fi
[[ $SCR_OPT_q = false ]] && echo $(echo "$SEARCH_MATCHES" | wc -l)" results found!" && echo
if [[ $SCR_OPT_p = true ]]; then
echo "$SEARCH_MATCHES"
else
for match in $SEARCH_MATCHES; do
echo -n "$match: "$(getProperty "$match" "errorTitle")
if [[ $SCR_OPT_e = true ]]; then
echo
echo " level: "$(getProperty "$match" "level")
echo " file: "$(getProperty "$match" "file")
echo " line: "$(getProperty "$match" "line")
echo " message: "$(getProperty "$match" "message")
fi
if [[ $SCR_OPT_f = true ]]; then
echo
echo
echo " Found in line: " $(grep -P -i --color=always "$@" PMcrash.$match.json)
fi
echo
done
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment