I have an existing basic script that I need to get the value of SERIAL only from it whether I grep cat or dog. Like this:
# grep dog | <additional commands>
123456789
The script = animals.sh
#!/bin/bash
ANIMAL=$1
case "${ANIMAL}" in
dog)
echo ""
echo "${ANIMAL} animal is chosen"
SERIAL=123456789
;;
cat)
echo ""
echo "${ANIMAL} animal is chosen"
SERIAL=987654321
;;
*)
echo ""
echo "wrong parameter applied"
exit 1
;;
esac
So far I have tried these however I'm still trying to research on how to continue or trim the other outputs
[ec2-user@ip-192-168-100-101 ~]$ grep dog -A 3 animals.sh
dog)
echo ""
echo "${ENV} animal is chosen"
SERIAL=123456789
[ec2-user@ip-192-168-100-101 ~]$
CodePudding user response:
If awk is your option, would you please try:
awk '
/dog/ {f = 1} # if the line matches "dog", set a flag
f && /SERIAL/ { # if the flag is set and the line matches "SERIAL"
sub(".*SERIAL=", "") # remove substring before the number
print # print the result
exit
}
' animals.sh
Output:
123456789
If you prefer grep solution, here is an alternative:
grep -Poz 'dog[\s\S] ?SERIAL=\K\d ' animals.sh
Explanation:
- The
-Poption enablesPCREregex. - The
-ooption tells grep to print only the matched substring - The
-zoption sets the record separator to the null character, enabling the pattern match across lines.
About the regex:
dog[\s\S] ?SERIAL=matches a shortest string (including newline characters) betweendogandSERIAL=inclusive.\Ktells the regex engine to discard preceding matches out of the matched pattern. It works to clear the matched pattern before\K.\dmatches a sequence of digits which will be printed as a result.
