🐚

who | grep -q '^guest\>'の\>とはなんなのか?

2023/11/15に公開

概要

『[改定版第3版]シェルスクリプト 基本リファレンス』という書籍を読んでいた際に、タイトル通りの記述が出てきたが、\>の意味がわからなかった。20分ほどの格闘の後にようやく意味を理解することができたので、メモ代わりに記事を投稿する。

結論

\<\>はGNU word boundaryを表す特殊文字。

解説

\<\>はword boundaryの名前の通り、単語の境界を表す。
例えば、以下のようなa.txtがあった場合、

a.txt
every
every morning
every.com
everyday
everyone

cat a.txt | grep 'every\>'を実行すると、以下のような出力になる。

every
every morning
every.com

everyは直後に入る改行文字が単語の境界だと判定され、
every morningはeveryの直後の空白が単語の境界だと判定され、
every.comはeveryの直後の.が単語の境界だと判定されるからである。
everydayとeveryoneはeveryのあとにdayやoneが続くので境界文字が存在しないと認識される。

ちなみに記号は基本的に単語の境界となるが、アンダーバーは特殊で、単語の境界とみなされない。
例えば、以下のようなb.txtがあった場合、

b.txt
every_day

cat b.txt | grep 'every\>'を実行しても、なにも出力されない。
これはevery_dayが2つの単語をアンダーバーで繋いだものではなく、長い1つの単語だとみなされるからである。

\<に関しても同様である。

原点回帰

タイトルに翻ってwho | grep -q '^guest\>'というコードの意味を考えてみる。
これはwhoコマンドの出力の中から、guest+境界文字で始まる列を抽出するという意味になる。
たとえばwhoコマンドの結果が以下だった場合、

admin      ....()....
guest      ....()....
guests     ....()....
guestuser  ....()....

who | grep '^guest\>'で出力されるのは

guest      ....()....

のみである。

参考

https://www.regular-expressions.info/refwordboundaries.html

GitHubで編集を提案

Discussion