"grep -w"コマンドが機能しない

"grep -w"コマンドが機能しない

次の入力があります。

csdi_d_trs_proc_uxs1        26 24
csdi_d_tdp_process_uxs1     28 32

proc以下を使用する場合は、次のものを含めてください。

grep proc filename 

両方の行が出力されるので、試してみましたが、grep -w proc filename出力は表示されません。

procどのようにラインだけを得ることができ、ラインは取得できませんかprocess

答え1

-wforフラグは、grep与えられた式が単語全体に一致するようにします。

「単語」は、「単語以外の文字」(または行の先頭/末尾)で囲まれた「単語文字」の文字列です。

あなたの場合、問題は_(アンダースコア)がまさに「単語文字」なので、proc単語だけでは資格を与えられないことです。

-wwithを使用する代わりに、grep単語を明示的に区別するパターンを使用してください_

grep '_proc_' filename

または、アルファベットの小文字以外の文字で単語を区切るには、次の[^a-z]代わりに使用します。_

grep '[^a-z]proc[^a-z]' filename

proc行の先頭/末尾の単語は認識されません。

答え2

-w, --word-regexp 単語全体を構成する項目を含む行のみを選択してください。 [...] 単語を構成する文字は、文字、数字、下線です。

ほとんどのプログラミング言語(少なくともC、Perl、シェル)では、下線は識別子の一部として有効であるため、ここでは「単語文字」と見なされます。

単語だけを一致させる1つの方法は、Perl正規表現によって提供される否定的な予測と予測テストを使用することです。ここで意味するのは、(?<![a-z])「その前には小文字がなく、(?![a-z])後にも同様に文字がありますproc

pcregrep '(?<![a-z])proc(?![a-z])' filename 

または、行の始まりと終わりを明示的に考慮してgrep EREを使用します。

grep -E '(^|[^a-z])proc([^a-z]|$)' filename

(どちらがよりきれいかわかりません。)

自然言語のテキストがある場合は[[:alpha:]]おそらく[a-z]

しかし、もちろん、_proc_そこに下線があることを知っていればgrepする方が簡単です。

関連情報