Можно перенаправить через awk вместо того, чтобы полагаться на код возврата.
grep posix test_file.txt|awk 'BEGIN{matches=0}{matches++}END{if(matches>0){print "success";}else{print "fail";}}'
Вывести только первое совпадение:
grep testvalue test_file.txt|awk 'BEGIN{matches="";}{matches=$0;}END{if(matches!=""){print "success";print matches;}else{print "fail";}}'
И с функцией захвата значения, где отображается каждое совпадение grep:
grep testvalue test_file.txt|awk 'BEGIN{matches="";}{matches=matches $0 "\n";}END{if(matches!=""){print "success";print matches;}else{print "fail";}}'
watch cat /proc/mdstat | grep -oE 'finish=[[:digit:]]+\.[[:digit:]]' | grep -oE '[[:digit:]]+\.[[:digit:]]'
Если вам действительно нравится формат "\ d" в стиле Perl и ваш grep поддерживает регулярные выражения в стиле Perl, то:
cat mdstat | grep -oP 'finish=\d+\.\d' | grep -oP '\d+\.\d'
где параметр "-P" указывает perl- стиль регулярных выражений.
Параметр «-o» указывает grep отображать только ту часть строки, которая соответствует регулярному выражению. Это то, что удаляет ненужный текст и позволяет нам вернуть только оставшееся время.
Вы можете использовать:
watch cat mdstatout | grep -oP 'finish\=\d+\.\d+' | cut -d= -f2
205.7
-o
указывает grep выводить только соответствующий текст, а не всю строку, а -P
позволяет использовать регулярное выражение perl что включает \ d
.
Кроме того, я использую cut
, чтобы вытащить цифры, а не другое регулярное выражение.