who | grep -q '^guest\>'の\>とはなんなのか?
概要
『[改定版第3版]シェルスクリプト 基本リファレンス』という書籍を読んでいた際に、タイトル通りの記述が出てきたが、\>
の意味がわからなかった。20分ほどの格闘の後にようやく意味を理解することができたので、メモ代わりに記事を投稿する。
結論
\<
と\>
はGNU word boundaryを表す特殊文字。
解説
\<
と\>
はword boundaryの名前の通り、単語の境界を表す。
例えば、以下のような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があった場合、
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 ....(略)....
のみである。
参考
Discussion