Рассмотрим следующий входной файл:
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
Вариант обеспечивает средство легко определить , существует ли или нет образец (или строка) в группе файлов. При поиске в нескольких файлах это обеспечивает улучшение производительности ( потому что он может выйти, как только найдет первое совпадение ) [...]
Теперь, в соответствии с тем же стандартом (во введении , под INPUT FILES )
Когда стандартная утилита считывает искомый входной файл и завершает работу без ошибки до того, как достигнет конца файла, утилита должна убедиться, что смещение файла в описании открытого файла правильно расположено сразу после последнего байта, обработанного утилитой [. ..]
tail -n +2 file
(sed -n 1q; cat) < file
...
Вторая команда эквивалентна первой, только если файл доступен для поиска.
Почему grep -q
потребляет весь файл?
Это gnu grep
если это имеет значение (хотя Кусалананда только что подтвердил, что то же самое происходит в OpenBSD)
grep
- это форк чего-то, называемого FreeGrep , если кому-то интересно.