Покажите всему файлу до соответствия

Острота, нейтрализации, одна строка вывода, никаких ошибок.

( lsb_release -ds || cat /etc/*release || uname -om ) 2>/dev/null | head -n1
76
13.04.2017, 12:22
6 ответов

Sed лучше для этого.

Просто сделайте:

sed '/PATTERN/q' FILE

Это работает как это:

Для каждой строки мы смотрим, если она соответствует /PATTERN:

  • если да, мы печатаем его и выходим
  • иначе мы печатаем его

Это - наиболее эффективное решение, потому что, как только оно видит PATTERN, это выходит. Без q, sed продолжил бы читать остальную часть файла, и ничего не делать с ним. Для больших файлов это может иметь значение.

Этот прием может также использоваться для эмуляции head:

sed 10q FILE
100
27.01.2020, 19:31
  • 1
    Просто попробованный, это просто производит первую строку файла... даже при том, что соответствие в строке 38. –  Nicolas Raoul 14.04.2011, 12:44
  • 2
    Хорошо работает для меня. Можно ли дать пример фактического ввода и вывода? И команда Вы работаете как есть. –  Mikel 14.04.2011, 12:46
  • 3
    я попробовал Вашу команду перед редактированием его это было: sed '/PATTERN/p; q' файл –  Nicolas Raoul 14.04.2011, 12:51
  • 4
    Что я должен сделать, если я не хочу печатать строку с соответствием шаблона? –  tommy.carstensen 06.07.2017, 15:29

sed может заменить большую часть функциональности grep.

sed -n '1,/<pattern>/ p' <file>

Это означает печать от первой строки, пока шаблон не подобран.

Несколько примеров диапазона

sed -n '/<pattern>/,$ p' <file> # from pattern to end of file
sed -n '/<pattern1>/,/<pattern2>/ p' <file> # from pattern1 to pattern2
37
27.01.2020, 19:31
  • 1
    Эта команда хороша, но можно добиться большего успеха. Таким образом, это читает целый файл, но возможно выйти, как только это нашло соответствие. –  Mikel 14.04.2011, 12:55
  • 2
    Что я должен сделать, если я не хочу печатать строку с соответствием шаблона? –  tommy.carstensen 06.07.2017, 15:29

печать до и включая соответствие:

awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename

печать до, НО НЕ включая соответствие:

awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename
36
27.01.2020, 19:31
  • 1
    Qпрохладный, но гну определенный afaik, sed -n '/pattern/!p;//q' было бы более портативным. –  don_crissti 06.04.2015, 16:36

Для людей, которые принимают решение помнить только основные инструменты в повседневной работе, и готовый принять менее изящные и менее эффективные решения:

head -n $(grep -n pattern filename | cut -d: -f1) filename

Если эта команда будет для сценария затем, то я буду искать более изящный (и возможно эффективный) решения. Если это - одна команда времени или бросок далеко сценарий затем, я не забочусь.

1
27.01.2020, 19:31
  • 1
    Хорошая идея, но три команды, когда каждый сделает. –  Mikel 14.04.2011, 12:47
  • 2
    Знание основ очень хорошо действительно. Знание правильного инструмента для задания лучше, все же. –  soulmerge 14.04.2011, 18:00
  • 3
    Если эта команда будет для сценария затем, то я буду искать более изящный (и возможно эффективный) решения. Если это - одна команда времени (или бросок далеко сценарий), то я не забочусь. –  lesmana 14.04.2011, 20:59

Вы также можете использовать один из после

tac ./test | grep -B $(cat ./test | wc -l) -m 1 'pattern'|tac 

или

tac ./test |head -n $(tac ./test | grep -n 'pattern' | cut -d: -f1 | head -n 1)|tac

или

tac ./test |sed ':a;N;$!ba;s/\n/'"pattern"'/g' | sed 's/'"patternpattern"'/\n/g'|head -n 1|sed 's/'"pattern"'/\n/g'|tac

Первый вариант очень похож на то, что предложил OP, только он обеспечивает отображение достаточного количества строк до контекста путем подсчета строк в файле

Второй вариант выполняет поиск по номеру строки первого совпадения (вы также можете изменить это, изменив внутреннюю 'head'), а затем использует head для этого числа

Последняя опция заменяет все новые строки совпадением, а затем заменяет два соседних совпадения новой строкой. Результатом этого является строка для каждого блока текста между двумя совпадениями. После этого он использует 'head' для выбора первой строки (перемещая блок текста до первого совпадения), а затем повторно переводит каждое совпадение в новую строку. эта опция работает, только если файл имеет следующий формат

pattern
texttexttext
texttexttext texttexttext
texttexttexttexttexttexttexttexttext
pattern
texttexttext
pattern 
texttexttext
texttexttexttexttexttexttexttexttext

и т. д.

0
27.01.2020, 19:31

Следующие чистые методы GNU grep неэффективны.

Искать все, вплоть до первого экземпляра строки « foo » в файле bar , используя три grep s:

grep -m 1 -B $(grep -n -m 1 foo bar | grep -o '^[0-9]*') foo bar

Соответствие последнему экземпляру « foo »:

grep -oPz "(?s)[^\n]*${s}.*?\n.*?foo.*?\n" bar

Примечание: подробности о последнем grep можно найти в: Regex (grep) для многострочного поиска необходим .

1
27.01.2020, 19:31

Теги

Похожие вопросы