grepで最初の一致のみを印刷する方法


14

ユーザー名をgrepしようとしています:

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

最初の一致のみを表示するにはどうすればよいgrepですか?


3
なんでgrepgrep検索用です。cutまたはのいずれかawkが必要と思われますが、read組み込みも適しているようです。
manatwork

@peterphが提案したこの作業は^ \ w * \ bです。カットまたはsed / awkの方が便利ですか?私の場合は簡単です。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

@ Yurij73違いは主に実行時間にあります。でread、あなたの新しいプロセスを生成しません。これを何度も行うと、違いに気付くでしょう。
peterph

awkを使用した方がよいですか?#!/ bin / bash(users | awk '$ 0 = $ 1')>ファイル; myVar <ファイル; rm -fファイル。echo $ myVar;
Yurij73

回答:


9

あなたが本当に最初の単語だけを返したいのでこれをやりたいのにgrepあなたgrepがたまたまGNUの最近のバージョンであるgrepなら、おそらく-oオプションが欲しいでしょう。私はあなたがこれなしでこれを行うことができると信じています、-Pそして\b最初は本当に必要ではありません。したがって:users | grep -o "^\w*\b"

それでも、@ manatworkが述べたように、シェルの組み込みreadまたはcut/ sed/ awkがより適切であるように見えます(特に、何かを行う必要がある場合は、さらに何かを行う必要がある場合)。


代替構文:grep -o "[^ ]*"
kenorb

@kenorbは実際には少し異なります(ただし、ほとんどの場合は機能します)。
peterph

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

なんでgrepgrepコマンドは、検索のためです。cutまたはawkが必要なようですが、組み込みの読み取りも適しているようです。

それらを比較してください:

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

変数に保存する場合は、bashを使用します。

read myVar blah < <(users)

または:

read myVar blah <<< $(users). 

@manatworkコメントに基づく上記の回答。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.