LINUX.ORG.RU

grep - поиск первого совпадения в файле

 ,


0

2

Про grep <string> <file>|head -n1 догадался, но работает долго и я не совсем понимаю как отрабатывает пайп, grep передает ему все строки которые нашел, а head уже отбирает первую или grep передает построчно и head убивает grep после первого совпадения (звучит невероятно, но мало ли)?


head убивает grep после первого совпадения (звучит невероятно, но мало ли)?

После второго grep убивается сам на SIGPIPE. Таким образом есть оверхед.

wandrien ()
Ответ на: комментарий от wandrien

После второго grep убивается сам на SIGPIPE. Таким образом есть оверхед.

Не в этом дело. Когда работает pipe, то буферизация происходит не по строкам, а по PIPEBUF, следовательно, если найденная строка меньше PIPEBUF, то head не получит строку на вход пока не заполнится либо буфер либо произойдёт завершение grep.

vodz ★★★★★ ()
Ответ на: комментарий от wandrien

Нет такого.

Не знаете, не спорьте. Сделайте несколько гигабайтный файл, где первой строчкой нужный текст и остальные - не совпадающий и пропустите через grep | head, сильно удивитесь.

vodz ★★★★★ ()
Ответ на: комментарий от wandrien

Не умеете читать маны, не влезайте.

Всё с вами ясно, знаний — ноль, городить чушь - чешется, понять или проверить — самомнение не позволяет.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Ты уже пример с cat проверил, умник? Запусти и нажми два раза enter, сильно удивишься.

man 7 pipe, курить до наступления просветления.

wandrien ()
Ответ на: комментарий от wandrien

Ты уже пример с cat проверил, умник?

Идиотик, причём тут cat вообще? Где вы его вставлять в grep | head будете и чем оно поможет? Максимум поможет --line-buffered у grep, который во-первых, работает так, о чем и было сказано, и потому надо знать и понимать об этом, что именно искать в man-ах.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Уже не первый раз замечаю, что ты сочетаешь великий апломб с великой же безграмотностью в вопросах, о которых берёшься «учить» в технических разделах.

Приходит, значит, чел и начинает рассказывать про PIPEBUF. А константы или переменной с таким именем даже не определено никаким стандартом. То есть даже базовый фактчекинг не сделал.

Потом внезапно перескакивает на детали реализации grep, хотя до этого говорил, типа, про пайпы.

Занимайтесь самообразованием, батенька, читайте книги, учитесь связно мыслить и связно излагать измысленное. Ну и маны почитывать не забывайте.

wandrien ()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от Kolins

grep – он про текст. 30 гигов текста?

Может, лучше sfk find? (да-да, «кулхацкерская» утилита, но работает реально шустро, в том числе и на огромных файлах).

demidrol ★★★★★ ()
Ответ на: комментарий от wandrien

Уже не первый раз замечаю, что ты сочетаешь великий апломб с великой же безграмотностью в вопросах, о которых берёшься «учить» в технических разделах.

Ну афигеть. Получили, значить, совершенно корректный первый ответ на абсолютную высказанную чушь, но так и ничего не поняли и даже не собирались разбираться, может люди таки умную вещь говорят. Главное ведь что в Интернете — ни в коем случае не соглашаться, что обосрался, надо во что бы то ни стало городить любую чушь с оскорблениями.

Приходит, значит, чел и начинает рассказывать про PIPEBUF.

Ну то есть таки man pipe не прочитали. Да, стандарт за 40 лет поменялся, теперь это называется PIPE_BUF, но афигеть же какая разница, правда?

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Ну то есть таки man pipe не прочитали. Да, стандарт за 40 лет поменялся, теперь это называется PIPE_BUF, но афигеть же какая разница, правда?

cat | head -1

Запускаем и думаем. Еще думаем. Сильнее думаем.

Приходим сюда с выводами.

А то получается как-то так:

Главное ведь что в Интернете — ни в коем случае не соглашаться, что обосрался, надо во что бы то ни стало городить любую чушь с оскорблениями.

wandrien ()
Ответ на: комментарий от wandrien

Приходим сюда с выводами.

Да мне не сложно повторить вывод то, вот прямо начиная с первого слова: grep - поиск первого совпадения в файле (комментарий)

Впрочем, всё как обычно: раз уж проблеска мыли так и не дождешься, проще заигнорить.

vodz ★★★★★ ()
Ответ на: комментарий от wandrien

cat | head -1

Если в слове хлеб^W grep сделать четыре ошибки то получится пиво^W cat

sin_a ★★★★★ ()
Ответ на: комментарий от wandrien

Ну да. Пайп вообще ничего не буферизирует в том смысле, что @vodz пытается продавить.

Как я и говорил, вы оба не правы. Поздравляю. Первый раз?

i-rinat ★★★★★ ()
Ответ на: комментарий от Kolins

Не помню можно ли regex без ограничителей писать (здесь /)

awk '/2020-01/ {print NR; exit}' /var/log/all-services.log

У тебя это был не регекс, а просто TRUE, поэтому выдало первую строку

futurama ★★★★★ ()
Последнее исправление: futurama (всего исправлений: 1)
Ответ на: комментарий от Kolins

Кстати если у тебя поля как-то разграничены в логе, то быстрее искать в поле, а не во всей строке

awk '$3 ~ /2021-01/ {...}'
futurama ★★★★★ ()
Ответ на: комментарий от i-rinat

Ты зато всегда прав. =) И это даже почти не шутка. Признавайся, сам-то помнил или в мане прочитал?

Я-то прочитал man grep как только vodz стал возбухать. Но соглашаться с идиотом, который не может сформулировать мысль - увольте.)

Первый раз?

Что первый раз-то?

wandrien ()
Ответ на: комментарий от wandrien

сам-то помнил или в мане прочитал?

Я на подобный момент относительно недавно натыкался. А в манах про это, кажется, ничего не написано. Сейчас поверхностно поискал, но ничего не нашёл.

Что первый раз-то?

Первый раз не прав.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Первый раз не прав.

Ну я из себя не строю специалиста по всему. Просто на агрессивно-хамское поведение чаще всего отвечаю тем же.

Да куда там специалист по всему, тут на днях писал патч к программе, чтобы она делала то, что требуется, а потом оказалось, что надо внимательнее прочитать документацию.

wandrien ()
Ответ на: комментарий от i-rinat

В info есть немного подробностей:

‘--line-buffered’
     Use line buffering for standard output, regardless of output
     device.  By default, standard output is line buffered for
     interactive devices, and is fully buffered otherwise.  With full
     buffering, the output buffer is flushed when full; with line
     buffering, the buffer is also flushed after every output line.  The
     buffer size is system dependent.
wandrien ()
Ответ на: комментарий от futurama

Так выдает правильную строку, но не быстрее чем grep. Ладно, скорость самого поиска не самое страшное, потом всеравно надо часть файла вырезать и сжать, что занимает существенно больше времени.

Kolins ()
Ответ на: комментарий от Kolins

Быстрее врядли, но гарантирован выход после первой строки и fflush() буфера

futurama ★★★★★ ()
Ответ на: комментарий от wandrien

писал патч к программе, чтобы она делала то, что требуется, а потом оказалось, что надо внимательнее прочитать документацию

Жизненно.

i-rinat ★★★★★ ()

–files-with-matches, если интересует только сам факт совпадения

annulen ★★★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей