Один из способов выполнить задачу такого типа c заключается в том, чтобы использовать код завершения предыдущей программы, чтобы определить, следует ли выполнять следующую программу.
В общем случае:
if anycommand; then
anothercommand
fi
anothercommand
будет выполняться только в том случае, если anycommand
был успешным, как определено кодом выхода для любой команды.
awk
может выйти с ненулевым статусом, если вы этого хотите. В качестве простого примера:
/MARC/ {
# Successful exit immediately if MARC is found
exit 0
}
/CRAM/ {
# Failure exit immediately if CRAM is found
exit 1
}
Тогда ваша задача становится записать код awk в exit 0
, если найдены MAR C STEVE и GREG, и exit 1
в противном случае. 0 - код выхода по умолчанию, поэтому убедитесь, что вы явно exit 1
, если они не все присутствуют.
if ./students.sh | awk 'your code here'; then
./students.sh -move
fi
Вы также можете "замкнуть" это. Два амперсанда говорят оболочке выполнять ./students -move
, только если предыдущая команда вышла со статусом 0.
./students.sh | awk 'your code here' && ./students.sh -move
РЕДАКТИРОВАТЬ: Когда Чарльз Даффи комментирует, вам определенно следует обратить внимание. Пожалуйста, прочитайте пост, на который он ссылался в комментариях. Вот пример того, как вы можете организовать свой код awk. Как написано, он чувствителен к регистру, поэтому «MAR C [FOUND]» не приведет к успеху. Кроме того, якорей здесь нет, поэтому «ARAMAR C [Found]» вызовет успех, а не просто «MAR C [Found]». Вам придется усилить код для обработки этих ситуаций, но, надеюсь, это поможет.
/MARC \[Found\]/ {
# Set flag to true
marc = 1
}
/STEVE \[Found\]/ {
steve = 1
}
/GREG \[Found\]/ {
greg = 1
}
END {
if (marc && steve && greg) {
# Successful exit if all 3 are found
exit 0
}
# Failure exit otherwise
exit 1
}
EDIT 2 : Возможно, вы заметили, что вышеупомянутое решение не очень хорошо масштабируется , Для проверки трех студентов это не плохо. Но если вы хотите проверить, что 10 000 учеников «найдены», решение несостоятельно. Если вы ищете решение, которое хорошо масштабируется, я бы хотел создать отсортированный файл с именем «required.dat», содержащий студентов, которых нужно найти. Запустив скрипт ./students.sh, направьте его на awk '$4 ~ /\[Found\]/ {print $1}' | sort > found.dat
. Это создаст другой файл со студентами, которые будут найдены. Затем введите N_REQ_NOT_FOUND=$(comm -23 required.dat found.dat | wc -l)
, чтобы найти количество студентов, которые были необходимы, но не найдены. Если $ N_REQ_NOT_FOUND больше 0, это означает, что некоторые учащиеся были обязательны, но не найдены.