Ключевым моментом здесь является то, что символ канала (|
) должен быть экранирован в оболочку. Используйте "\|
" или "'|'
", чтобы защитить его от вмешательства оболочки и разрешить его передачу в awk
в командной строке.
Читая комментарии, я вижу, что оригинальный постер представляет упрощенную версию исходной задачи, которая включала фильтрацию file
перед выбором и печатью полей. Был использован пропуск grep
, и результат был передан в awk для выбора поля. Это объясняет совершенно ненужный cat file
, который появляется в вопросе (он заменяет grep <pattern> file
).
Хорошо, это сработает. Тем не менее, awk в значительной степени является инструментом сопоставления с образцом сам по себе, и ему можно доверять, чтобы находить и работать с совпадающими строками без необходимости вызывать grep
. Используйте что-то вроде:
awk -F\| '/<pattern>/{print $2;}{next;}' file
Бит /<pattern>/
указывает awk
выполнить действие, которое следует за строками, которые соответствуют <pattern>
.
Потерянный {next;}
- это действие по умолчанию, пропускающее следующую строку ввода. В этом нет необходимости, но у меня есть эта привычка издавна ...