Как напечатать только первый матч с grep

14

Я пытаюсь grep имя пользователя:

users | grep "^\b\w*\b" -P

Как я могу заставить его показывать только первый матч с grep?

Yurij73
источник
3
Почему grep? grepдля поиска. Кажется, вам нужен либо cutили awk, но readвстроенный также кажется подходящим.
Манатворк
эта работа, предложенная @peterph ^ \ w * \ b. Вырезаны или удобнее / удобнее? мой случай прост. я могу использовать myVar = `users | grep -o "^ \ w * \ b" `, нет?
Yurij73
3
Сравните их: users | cut -d' ' -f1, users | sed 's/\s.*//', users | awk '$0=$1'. Если вы хотите сохранить его в переменной, используйте bash: read myVar blah < <(users)или read myVar blah <<< $(users).
manatwork
@ Yurij73 разница в основном во времени исполнения. с readвами не порождает новый процесс. Если вы сделаете это много раз, вы заметите разницу.
Петер
Это лучше использовать awk? #! / bin / bash (users | awk '$ 0 = $ 1')> file; читать myVar <файл; файл rm -f; echo $ myVar;
Yurij73

Ответы:

9

Если вы действительно хотите вернуть только первое слово и хотите сделать это, grepи ваша grepверсия является последней версией GNU grep, вы, вероятно, захотите эту -oопцию. Я считаю, что вы можете сделать это без -Pи \bв начале не является действительно необходимым. Следовательно: users | grep -o "^\w*\b".

Тем не менее, как упоминалось в @manatwork, встроенная оболочка readили cut/ sed/ awkкажется более подходящей (особенно когда вы дойдете до того, что вам нужно будет сделать что-то большее).

peterph
источник
Альтернативный синтаксис:grep -o "[^ ]*"
kenorb
@kenorb, который немного отличается на самом деле (но будет работать в большинстве случаев).
Петер
34

Чтобы показать только первое совпадение с grep, используйте -mпараметр, например:

grep -m1 pattern file

-m num, --max-count=num

Прекратить чтение файла после совпадения num.

kenorb
источник
1

у меня это сработало. первый матч поймал с:

users | grep -m 1 "^\b\w*\b"

и последний матч поймать с

users | grep "^\b\w*\b" |tail -1
foad322
источник
0

Почему grep? Команда grepдля поиска. Кажется, вам нужно либо, cutлибо awk, но встроенное чтение также кажется подходящим.

Сравните их:

users | cut -d' ' -f1
users | sed 's/\s.*//'
users | awk '$0=$1'

Если вы хотите сохранить его в переменной, используйте bash:

read myVar blah < <(users)

или:

read myVar blah <<< $(users). 

Выше ответ на основе комментариев @manatwork .

оборота кенорб
источник