Острота, нейтрализации, одна строка вывода, никаких ошибок.
( lsb_release -ds || cat /etc/*release || uname -om ) 2>/dev/null | head -n1
Sed лучше для этого.
Просто сделайте:
sed '/PATTERN/q' FILE
Это работает как это:
Для каждой строки мы смотрим, если она соответствует /PATTERN
:
Это - наиболее эффективное решение, потому что, как только оно видит PATTERN
, это выходит. Без q
, sed продолжил бы читать остальную часть файла, и ничего не делать с ним. Для больших файлов это может иметь значение.
Этот прием может также использоваться для эмуляции head
:
sed 10q FILE
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
печать до и включая соответствие:
awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename
печать до, НО НЕ включая соответствие:
awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename
Q
прохладный, но гну определенный afaik, sed -n '/pattern/!p;//q'
было бы более портативным.
– don_crissti
06.04.2015, 16:36
Для людей, которые принимают решение помнить только основные инструменты в повседневной работе, и готовый принять менее изящные и менее эффективные решения:
head -n $(grep -n pattern filename | cut -d: -f1) filename
Если эта команда будет для сценария затем, то я буду искать более изящный (и возможно эффективный) решения. Если это - одна команда времени или бросок далеко сценарий затем, я не забочусь.
Вы также можете использовать один из после
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
и т. д.
Следующие чистые методы 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) для многострочного поиска необходим .