Розглянемо наступний вхідний файл:
1
2
3
4
Біг
{ grep -q 2; cat; } < infile
нічого не друкує. Я очікую, що він надрукує
3
4
Я можу отримати очікуваний вихід, якщо його зміню
{ sed -n 2q; cat; } < infile
Чому перша команда не друкує очікуваний вихід?
Це вхідний файл, який можна шукати і згідно стандарту в розділі ВАРІАНТИ :
-q
Quiet. Nothing shall be written to the standard output, regardless of
matching lines. Exit with zero status if an input line is selected.
і далі внизу, ВИКОРИСТАННЯ ЗАЯВКИ (підкресліть моє):
Цей
-qпараметр забезпечує засіб легко визначити, чи існує шаблон (або рядок) у групі файлів. При пошуку декількох файлів він забезпечує поліпшення продуктивності ( оскільки він може вийти з роботи, як тільки знайде першу відповідність ) [...]
Тепер, за тим самим стандартом (у вступі , під ВХІДНІМ ФАЙЛАМ )
Коли стандартна утиліта зчитує шуканий вхідний файл і закінчується без помилки до того, як він дійде до кінця файлу, утиліта повинна гарантувати, що зміщення файлу у відкритому описі файлу належним чином розміщене біля останнього байта, обробленого утилітою [. ..]
tail -n +2 file
(sed -n 1q; cat) < file
...
Друга команда еквівалентна першій лише тоді, коли файл можна шукати.
Чому grep -qспоживається весь файл?
Це gnu grepякщо це має значення (хоча Кусалаланда просто підтвердив те, що відбувається на OpenBSD)
grep- це вилка чогось, що називається FreeGrep , якщо хтось цікавиться.