如何使用grep仅打印第一个匹配项


14

我正在尝试grep用户名:

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

我怎样才能只显示与的第一场比赛grep


3
为什么grepgrep用于搜索。您似乎需要cutawk,但read内置函数似乎也很合适。
manatwork

这项工作就像@peterph提出的^ \ w * \ b。削减或修改/修改更方便吗?我的情况很简单。我可以使用myVar =`users | grep -o“ ^ \ w * \ b”`,不是吗?
Yurij73

3
比较他们:users | cut -d' ' -f1users | sed 's/\s.*//'users | awk '$0=$1'。如果要将其存储在变量中,请使用bashread myVar blah < <(users)read myVar blah <<< $(users)
manatwork 2012年

@ Yurij73的区别主要在于执行时间。与read您不会产生新的过程。如果您多次这样做,您会注意到其中的不同。
peterph

使用awk更好吗?#!/ bin / bash(users | awk'$ 0 = $ 1')>文件; 读取myVar <文件; rm -f文件; echo $ myVar;
Yurij73

Answers:


9

如果您真的只想返回第一个单词并希望这样做,grep而您grep恰巧是GNU的最新版本grep,则可能需要该-o选项。我相信您可以在没有的情况下执行此操作,-P并且\b一开始就没有必要。因此:users | grep -o "^\w*\b"

然而,正如@manatwork提到,壳牌内置readcut/ sed/ awk似乎是更合适的(特别是一旦你到你需要做的事情更多了点)。


替代语法:grep -o "[^ ]*"
kenorb

@kenorb实际上有点不同(但在大多数情况下都可以使用)。
彼得,2015年

34

要仅显示带有的第一个匹配项grep,请使用-m参数,例如:

grep -m1 pattern file

-m num--max-count=num

num个匹配项后停止读取文件。


1

它对我有用。

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

最后一场比赛

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

0

为什么grep呢 该grep命令用于搜索。您似乎需要cutawk,但内置的阅读内容似乎也很合适。

比较它们:

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

如果要使用bash将其存储在变量中:

read myVar blah < <(users)

要么:

read myVar blah <<< $(users). 

以上答案基于@manatwork评论

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.