Як надрукувати перший рядок за допомогою команди grep?


17

У мене файл називається file.txt. Як я можу надрукувати перший рядок лише за допомогою grepкоманди?


4
Буде head -1 file.txtне працює?
clk

@steeldriver вам потрібно дати відповідь, оскільки це спосіб зробити це з греп, дивно вибраним інструментом для роботи.
Мельбурслан

1
grepне найкращий інструмент для друку першого рядка файлу. Якщо ви просто мали на увазі, що хочете надрукувати відповідний перший рядок grep, або у вас є певне використання grep, будь ласка, повідомте нам, що це таке. Якби у нас було більше контексту, можливо, ми могли б дати відповідь, яка б краще допомогла вам та громаді.
DKing

@MelBurslan У file.txt у мене є, наприклад, три рядки: Це новий файл. Другий рядок: ім'я файлу newFile Третій рядок: я не створив новий рядок. Отже, використовуючи команду grep, як я можу надрукувати лише перший рядок? Крім того, яка команда допоможе мені надрукувати перший і останній рядки? Чи можете ви, хлопці, скажіть мені команди для обох питань?
Нітін Сантош

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

Відповіді:


38

Хоча це нетрадиційне застосування grep, ви можете це зробити, використовуючи

grep -m1 "" file.txt

Це працює, тому що порожній вираз відповідає будь-якому, а -m1примушує вийти grep після першого збігу

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

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

4
Це може працювати в деяких системах, але це не портативно:grep: unknown option -- m
Kusalananda

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працювала б на своєму місці.

Якщо ви хочете роздрукувати перший рядок лише, якщо він відповідає шаблону, тоді головка труби переходить у греп

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 *//"
)

Я ставлю цю відповідь тут як приклад ідеї, що те, що ти можеш щось робити (греп, баш або ... тощо), не означає, що ти повинен - мабуть, кращий інструмент для роботи. 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.