Как напечатать первую строку, используя команду grep?


17

У меня есть файл с именем file.txt. Как я могу напечатать первую строку только с помощью grepкоманды?


4
Не head -1 file.txtбудет работать?
clk

@steeldriver вам нужно сделать это ответом, поскольку это способ сделать это с помощью grep, странно выбранного инструмента для работы.
MelBurslan

1
grepне лучший инструмент для печати первой строки файла. Если вы просто имели в виду, что хотите напечатать первую соответствующую строку grep, или если у вас есть какое-то конкретное применение grep, сообщите нам, что это такое. Если бы у нас было больше контекста, возможно, мы могли бы дать ответ, который лучше помог бы вам и сообществу.
DKing

@MelBurslan В файле file.txt у меня есть три строки, например: Это новый файл. Вторая строка: имя файла newFile. Третья строка: я не создал новую строку. Итак, используя команду grep, как я могу напечатать только первую строку? Также Как какая команда поможет мне напечатать как первую, так и последнюю строку? Ребята, скажите, пожалуйста, команды для обоих вопросов?
Нитин Сантош,

Если какой-либо из существующих ответов решит вашу проблему, попробуйте принять его с помощью галочки. Спасибо!
Джефф Шаллер

Ответы:


38

Хотя это нестандартное применение grep, вы можете сделать это, используя

grep -m1 "" file.txt

Это работает, потому что пустое выражение соответствует чему-либо, в то время как -m1grep завершает работу после первого совпадения

-m NUM, --max-count=NUM
       Stop reading a file after NUM matching lines.

+1 за то, что показал, что покрытый шоколадом банан здесь не так бесполезен, как я думал.
Камиль Мачоровски

4
Это может работать на некоторых системах, но это не переносимо:grep: unknown option -- m
Кусалананда

1
Обратите внимание на разницу между «первая строка» и «первая строка соответствует»
Чарльз

13

Это не то, что grepделает. Само название «grep» является аббревиатурой от « поиска в регулярном выражении глобально и печати», что и делает edкоманда g/re/p(для данного регулярного выражения re).

edинтерактивный линейный редактор 1969 года, но, тем не менее, он, скорее всего, установлен в вашей системе сегодня. Мы получили grepот ed, и это можно рассматривать как ярлык или псевдоним для конкретной функциональности ed, и sed, что «ручейки ed», т.е. (неинтерактивный) поток редактор.

Давайте использовать sedвместо этого:

$ sed -n '1p' file.txt

1pСтрока представляет собой миниатюрный sed«сценарий» , который печатает ( p) линия , соответствующая данному адресу ( 1первая строка). Кстати, команда редактирования 1p(не удивительно) будет делать то же самое в edредакторе.

-nПодавляет вывод ничего явно не напечатанной по сценарию, так что все , что мы получаем это первая строка файла file.txt.

В качестве альтернативы:

$ sed '1q' file.txt

Это печатает все строки файла, но выходит ( q) в строке 1 (после печати). Это в точности эквивалентно head -n 1 file.txt.

В стандарте POSIX говорится (обобщая), что head -n Nэто почти то же самое sed 'Nq', что «печатать каждую строку, но выходить в строке N». Причина headбыла включена в стандарт вообще из-за симметрии tail(и обратной совместимости с существующими реализациями Unix).


Это самый светлый ответ, первый ответ - странный взлом. Я знал, что было что-то странное, спасибо, что показали мне историю grep и ed. Все это имеет смысл сейчас.
Томас

6

Если в первой строке нет уникальной строки, вы не можете сделать это, используя только grep. head -n 1 file.txtбудет работать на своем месте.

Если вы хотите распечатать первую строку, только если она соответствует шаблону, то труба в grep

head -n 1 * | grep [pattern]


2

Еще одно нетрадиционное использование Grep - преобразование Шварца, которое проходит несколько циклов для нумерации строк, затем использует grep для поиска номера строки, а затем убирает номер строки обратно:

function grep1() (
  nlines=$(wc -l < "$1")
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep '^1 ' | sed 's/^1 *//'
)

function greplast() (
  nlines=$(wc -l < "$1")
  nlines=$((nlines + 0))
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep "^$nlines " | sed "s/^$nlines *//"
)

Я помещаю этот Ответ здесь в качестве примера идеи, что просто потому, что вы можете что-то делать в (grep или bash или ... и т.д.), не означает, что вы должны это делать - возможно, есть лучший инструмент для этой работы. sed ( sed 1qили sed -n 1p) и head ( head -n 1) являются более подходящими инструментами для печати первой строки из файла. Для печати последней строки файла у вас есть tail -n 1илиsed -n '$p', Мало того, что эти инструменты являются единственной командой (вместо 3+ в вышеуказанных функциях), они также намного понятнее для будущих читателей - возможно, для себя! - из сценариев, в которых они находятся. Хотя я не являюсь одним из (в настоящее время 3) отрицателей вашего вопроса, вполне вероятно, что ваша настойчивость в выборе произвольного инструмента для работы (без каких-либо вспомогательных причин) является причиной отрицательные голоса. Это крайне маловероятно , что система , которая имеет grepтакже не имеет head, tailи sed.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.