Я предполагаю, что вам нужно проверить pattern2
вместе с некоторыми другими условиями, если это так, попробуйте.
awk '/pattern1/ {t[1]=$0;next}
/pattern2/ && /check_other_text_in_current_line/{t[2]=$0;next}
/pattern3/ {t[3]=$0;next}
/target3/ { print t[3] }
1
/target1/ { print t[1] }
/target2/ { print t[2] }' file
Выше проверяется, check_other_text_in_current_line
строка (которая является образцом, и вы можете изменить ее в соответствии с фактической строкой) присутствует вместе с pattern2 также в той же строке. Если это не то, что вы ищете, пожалуйста, опубликуйте примеры входных и ожидаемых результатов в вашем сообщении.
ИЛИ, если вы ищете, что только 1-й совпадет с pattern2
во Input_file и пропустите все остальные, попробуйте. Он напечатает только самое первое совпадение для pattern2 и пропустит все остальные (поскольку образцы не предоставляются OP, поэтому этот код написан только для запроса конкретного сопоставления с образцом)
awk '/pattern1/ {t[1]=$0;next}
/pattern2/ && ++count==1{t[2]=$0;next}
/pattern3/ {t[3]=$0;next}
/target3/ { print t[3] }
1
/target1/ { print t[1] }
/target2/ { print t[2] }' file
OR
awk '/pattern1/ {t[1]=$0;next}
/pattern2/ && !found2{t[2]=$0;found2=1;next}
/pattern3/ {t[3]=$0;next}
/target3/ { print t[3] }
1
/target1/ { print t[1] }
/target2/ { print t[2] }' file
РЕДАКТИРОВАТЬ: Хотя мое второе решение выглядит так, как должно быть в соответствии с запросом OP, но полная картина требования не приводится, поэтому добавление кода только для печати Pattern2 (строка * 1027) *) Первый случай здесь.
awk '/RELOC_DIR/ && ++ count==1{print}' Input_file
RELOC_DIR = /i/j/k/l/m
OR
awk '!found2 && /RELOC_DIR/ { t[2]=$0; found2=1; print}' Input_file