Issue
I have to read a file (myfile.txt) and fetch the particular value matching with conditions and writing to a new file (newfile.txt).
I have to write "actualValue"
matching with "status":"ERROR"
, "metricKey":"new_coverage"
to newfile.txt only if conditions are matched.
otherwise I have to write newfile.txt empty.
if myfile.txt
{"projectStatus":{"status":"ERROR","conditions":[{"status":"ERROR","metricKey":"new_bugs","comparator":"GT","periodIndex":1,"errorThreshold":"0","actualValue":"2"},{"status":"ERROR","metricKey":"new_reliability_rating","comparator":"GT","periodIndex":1,"errorThreshold":"1","actualValue":"3"},{"status":"ERROR","metricKey":"new_security_rating","comparator":"GT","periodIndex":1,"errorThreshold":"1","actualValue":"2"},{"status":"OK","metricKey":"new_maintainability_rating","comparator":"GT","periodIndex":1,"errorThreshold":"1","actualValue":"1"},{"status":"ERROR","metricKey":"new_code_smells","comparator":"GT","periodIndex":1,"errorThreshold":"0","actualValue":"20"},{"status":"ERROR","metricKey":"new_vulnerabilities","comparator":"GT","periodIndex":1,"errorThreshold":"0","actualValue":"2"},{"status":"ERROR","metricKey":"coverage","comparator":"LT","errorThreshold":"90","actualValue":"80.9"},{"status":"ERROR","metricKey":"new_coverage","comparator":"LT","periodIndex":1,"errorThreshold":"90","actualValue":"14.810126582278482"}],"periods":[{"index":1,"mode":"previous_version","date":"2021-11-04T14:47:41+0000"}],"ignoredConditions":false}}
expected output on newfile.txt:
14.810126582278482
if myfile.txt
{"projectStatus":{"status":"ERROR","conditions":[{"status":"OK","metricKey":"new_bugs","comparator":"GT","periodIndex":1,"errorThreshold":"0","actualValue":"0"},{"status":"OK","metricKey":"new_reliability_rating","comparator":"GT","periodIndex":1,"errorThreshold":"1","actualValue":"1"},{"status":"OK","metricKey":"new_security_rating","comparator":"GT","periodIndex":1,"errorThreshold":"1","actualValue":"1"},{"status":"OK","metricKey":"new_maintainability_rating","comparator":"GT","periodIndex":1,"errorThreshold":"1","actualValue":"1"},{"status":"OK","metricKey":"new_code_smells","comparator":"GT","periodIndex":1,"errorThreshold":"0","actualValue":"0"},{"status":"OK","metricKey":"new_vulnerabilities","comparator":"GT","periodIndex":1,"errorThreshold":"0","actualValue":"0"},{"status":"ERROR","metricKey":"coverage","comparator":"LT","errorThreshold":"90","actualValue":"19.7"},{"status":"OK","metricKey":"new_coverage","comparator":"LT","periodIndex":1,"errorThreshold":"90","actualValue":"100.0"}],"periods":[{"index":1,"mode":"previous_version","date":"2022-06-29T05:54:05+0100"}],"ignoredConditions":false}}
expected output on newfile.txt:
empty
- (I have to keep newfile.txt empty)
this is what I tried
sed -n 's/.*"status":"ERROR".*"metricKey":"new_coverage".*"actualValue":"\([^"]*\)".*/\1/p' myfile.txt > newfile.txt
I referred:
how to fetch a selected value from a text file using a shell script
Can someone help me to figure out this? Thanks in advance!
Note: I am not allowed to use Jq or general purpose scripting language (JavaScript, Python etc).
Solution
With GNU grep
you could try following code, written and tested with your shown samples. This will make sure your to print values of actualValue
only if status
is ERROR
and metricKey
is "new_coverage
grep -oP '"status":"ERROR","metricKey":"new_coverage".*?"actualValue":"\K([^"]*)' Input_file
Answered By - RavinderSingh13 Answer Checked By - Robin (WPSolving Admin)