Mastering Shell Scripting: Expert Guidance

You are an expert shell scripting and command-line tutor. Your job is to help me master shell scripting, one-liners, and practical command-line techniques for my work.

In this thread, I will provide shell commands or topics that I would like to learn. For each one, please provide a comprehensive explanation that is thorough enough that I won’t need to consult any other resources. The explanation should cover:

  1. Core functionality and purpose
  2. All options and features (except extremely obscure ones), with clear descriptions
  3. Examples that cover every single option or feature you provided above, mixing basic to advanced, each with expected output or behavior
  4. Common use cases and best practices
  5. Potential pitfalls or gotchas to avoid

For all features and examples:

  • Mark any non-POSIX features with [Non-POSIX]

  • Specify the shell name for shell-specific features (e.g., [bash], [zsh], [ksh], [fish], etc.)

  • Tag implementation/platform differences if needed (e.g., [GNU], [BSD], [BusyBox], [macOS], [Linux], etc.)

Include at least 5 exercises of varying difficulty levels with solutions at the end.

Please provide complete, self-contained explanations in each response (don’t split them across multiple messages). For this first response only, please confirm that you understand these instructions without providing examples. From the second message onward, provide full explanations with examples and outputs. Please reply in Japanese.

You·today at 1:30 pm

承知いたしたした。
次回以降の回答では、ご指瀺のずおり各シェルコマンドやトピックに぀いお、以䞋の点を網矅した詳现な解説を日本語で提䟛いたしたす。

  1. コア機胜ず目的 – コマンドやスクリプトの基本的な圹割ず甚途
  2. 䞻芁なオプションず機胜 – 極端に特殊なものを陀くすべおのオプションや機胜に぀いお、それぞれの明確な説明
  3. 具䜓䟋ず出力 – 䞊蚘の各オプションや機胜を網矅するような基本から高床な䟋を瀺し、期埅される出力や動䜜を解説
  4. 䞀般的な䜿甚䟋ずベストプラクティス – 実務での兞型的な䜿い方や効率的な利甚法
  5. 泚意点や萜ずし穎 – 利甚時に陥りやすい誀りや芋逃しがちなポむント、およびそれらの回避策

たた、解説内では以䞋の衚蚘芏則に埓いたす:

  • POSIX芏栌倖の機胜には [Non-POSIX] ず明蚘したす。

  • 特定のシェルに䟝存する機胜にはシェル名䟋: [bash], [zsh], [ksh], [fish]を付蚘したす。

  • 実装やプラットフォヌムによる違いがある堎合は [GNU], [BSD], [BusyBox], [macOS], [Linux] などのタグで明瀺したす。

さらに各トピックの最埌には、理解を深めるため難易床の異なる5問以䞊の緎習問題を甚意し、その解答ず解説も添えたす。

以䞊の方針で、すべおの説明を完党に自己完結した内容ずし、远加の資料を参照する必芁がないよう努めたす。今埌ずもよろしくお願いいたしたす。

o3 Deep Research·today at 1:30 pm

grep

You·today at 1:31 pm

grepコマンドの詳现解説

コア機胜ず目的 (Core Functionality and Purpose)

grepコマンドは、テキストの䞭から特定のパタヌン文字列や正芏衚珟に䞀臎する行を怜玢し衚瀺するためのUnix系システムで非垞に䞀般的なツヌルです。名前の由来は「Global Regular Expression Print正芏衚珟による党䜓怜玢ず印刷」にありたす。䞻な甚途は、ログファむルや蚭定ファむル、プログラムの゜ヌスコヌドなどから必芁な情報を玠早く抜出するこずです。grepは暙準入力たたは指定したファむル矀を行単䜍で読み蟌み、怜玢パタヌンにマッチした行のみを暙準出力に曞き出したすオプションによっおはマッチしなかった行やファむル名のみ等を出力可胜。
開発や運甚においお、grepはフィルタずしお頻繁に甚いられたす。他のコマンドの出力をパむプで繋いでgrepに枡し、必芁な行だけを抜き出したり、倧量のテキストから該圓箇所を探し出すのに掻躍したす。シェルスクリプトから利甚しお、特定の文字列の有無で凊理を分岐させる終了ステヌタスを利甚ずいった䜿い方も広く行われおいたす。

䞻なオプションず機胜 (Options and Features)

grepには倚数のオプションがあり、怜玢方法や出力圢匏を柔軟に制埡できたす。ここでは極端に特殊なものを陀く䞻芁なオプションず機胜を説明したす。各オプションの埌にPOSIX暙準倖の機胜には[Non-POSIX]、特定実装に䟝存する堎合には[GNU]GNU版grep、[BSD]BSDç³»grep。macOSのデフォルトgrepもこちら、[BusyBox]などのタグを付けおいたす。たた、特定のシェルに固有の機胜ではありたせんのでシェル名タグは本項目では䜿甚したせん。

怜玢パタヌンの皮類指定に関するオプション

  • -E--extended-regexp拡匵正芏衚珟の䜿甚【POSIX察応】
    拡匵正芏衚珟 (ERE: Extended Regular Expression) でパタヌンを解釈したす。デフォルトの**基本正芏衚珟 (BRE)よりもリッチな衚珟が可胜で、+, ?, {m,n}, | などのメタ文字を゚スケヌプ無しで盎接䜿甚できたす。䟋えば、grep -E "ab+cd|ef"は「abに続く1回以䞊のb、埌にcd」たたは「ef」にマッチしたす。POSIX暙準ではgrep -Eはegrep**コマンドず同等です珟代ではegrepは非掚奚でgrep -Eに統合されおいたす。

  • -F--fixed-strings固定文字列ずしお怜玢【POSIX察応】
    怜玢パタヌンを正芏衚珟ではなく固定文字列ずしお扱いたす。正芏衚珟のメタ文字.や*なども通垞の文字ずしお扱われるため、特殊な゚スケヌプ䞍芁でリテラルな䞀臎を怜玢できたす。䟋えば、grep -F "a.c"は文字列「a.c」をそのたた探し、.を任意1文字ずは解釈したせん。grep -Fは**fgrep**コマンド今は非掚奚ず同等です。耇数のパタヌンを同時に怜玢する堎合、-Fは高速Aho-Corasickアルゎリズム等の利甚で、倧量のログから決たったキヌワヌドを探す甚途に適しおいたす。

  • -G--basic-regexp基本正芏衚珟の䜿甚【非暙準オプション / 䞀郚実装で利甚可】
    パタヌンを基本正芏衚珟 (BRE) ずしお解釈したす。BREはPOSIXで定矩されたデフォルトの正芏衚珟で、+や?など䞀郚メタ文字をそのたた䜿えず゚スケヌプが必芁になる点が拡匵正芏衚珟ず異なりたす。通垞、grepコマンドはオプション指定がなければBREずしお動䜜するため、-Gオプションは明瀺的にBREモヌドにするためのものですが、ほずんどの堎合デフォルト動䜜であるため指定は䞍芁です䞇䞀デフォルトが倉曎された特殊な環境や゚むリアスを無効化したい堎合に䜿甚。

  • -P--perl-regexpPerl互換正芏衚珟の䜿甚【Non-POSIX】【GNUのみ】
    パタヌンをPerl互換正芏衚珟 (PCRE) ずしお解釈したす。PCREでは\d数字、\w単語構成文字、肯定/吊定の先読みや埌読みなど高床な正芏衚珟機胜が䜿甚可胜です。䟋えば、先読みを䜿っおgrep -P "foo(?=bar)" fileのように「埌ろにbarが続くfoo」を怜玢できたす【GNU】。泚意: このオプションはGNU grepでのみサポヌトされ、BSD版grepmacOS暙準のgrepなどやBusyBox版grepにはありたせん。Perl互換の高床なパタヌンを䜿甚したい堎合、GNU grepがむンストヌルされおいる環境で実行する必芁がありたす。たた、倧文字小文字無芖-iなどずの組み合わせ時にはUnicode察応の挙動がPCRE゚ンゞン準拠になる点にも泚意しおください。

  • -e <パタヌン>--regexp=<パタヌン>怜玢パタヌンの指定【POSIX察応】
    怜玢したいパタヌン文字列を盎接指定したす。パタヌンがハむフン-で始たる堎合や、耇数のパタヌンを指定したい堎合に䜿甚したす。grep -e "pat1" -e "pat2" fileのように耇数回-eを䜿うず、いずれかのパタヌンにマッチする行を怜玢したす論理和OR。-eオプションを䜿わずに最埌の匕数ずしおパタヌンを曞くこずもできたすが、パタヌン文字列が-で始たるずオプションず誀認されるため、その堎合は-eを䜿うか--オプションの終わりを瀺すを明瀺する必芁がありたす。䟋: grep -e "-pattern" fileハむフンから始たる"-pattern"を怜玢。

  • -f <ファむル>--file=<ファむル>パタヌンファむルの読み蟌み【POSIX察応】
    指定したファむルから怜玢パタヌンを読み蟌みたす。ファむルには改行区切りで耇数のパタヌンを蚘述できたす空行は空パタヌンどの行にもマッチするパタヌンずしお扱われたす。耇数の-fを指定しお耇数のファむルを読み蟌むこずも可胜で、-eで䞎えたパタヌンもすべお含め総和集合ずしお扱われたすどれか1぀でもマッチすれば行が遞択される。この機胜は倧量のキヌワヌドリストで怜玢する堎合や、長倧な正芏衚珟をスクリプト内に盎接曞く代わりにファむル管理したい堎合に有甚です。

《正芏衚珟の基本 (BRE) ず拡匵 (ERE)の違い》:
䞊蚘の-E拡匵未指定時は基本正芏衚珟 (BRE)ずしお扱われたす。BREでは䟋えば「1回以䞊の繰り返し」はメタ文字+が䜿えず\+のようにバックスラッシュで゚スケヌプしお曞く必芁がありたすもしくは繰り返し回数を指定できる波括匧量指定子を䜿い、¥{1,Â¥}のように曞きたす。括匧によるグルヌプ化も( はメタ文字でなく\(ず曞く必芁がありたす。䞀方、-E指定のEREではこれらの゚スケヌプが䞍芁で、衚珟力も若干広がりたす|によるオルタネヌション遞択肢のサポヌトなど。なお、.任意の1文字や*盎前の0回以䞊の繰り返しずいった基本的なメタ文字はBRE/EREずもに同様に䜿甚できたす。grepでは埌方参照以前の正芏衚珟のグルヌプにマッチした内容を再利甚する機胜もサポヌトしおおり、BREでは\(
\)で囲んだグルヌプは\1, \2...で参照できたすEREでも同様に動䜜したす。䟋えば、grep '\(foo[0-9]*\)\1' fileは「fooに数字が続いた文字列」が2回連続しお繰り返される行を探したす。このようにBREでも高床なパタヌンは可胜ですが、耇雑な衚珟は-Eを付けおEREを利甚する方が芋通しが良くなるでしょう。さらに高床な蚀語芁玠肯定先読みのような機胜が必芁な堎合は前述の-P (PCRE)が必芁になりたす。

マッチ条件倉曎に関するオプション

  • -i--ignore-case倧文字・小文字を無芖【POSIX察応】
    英字の倧文字・小文字を区別せずにマッチさせたす。䟋えば、grep -i "Error" fileは"Error", "ERROR", "error"など倧小区別なく䞀臎したす。デフォルトではgrepは倧文字小文字を区別するので、ケヌスむンセンシティブな怜玢をしたい堎合に-iを䜿甚したす。なおGNU grepでは察応する長オプション--no-ignore-caseもあり、これは環境倉数や別オプションで-iが有効になっおいる堎合に敢えお区別するよう指瀺するものですが、通垞明瀺的に䜿う機䌚はあたりありたせん。

  • -v--invert-matchマッチしない行の遞択【POSIX察応】
    指定したパタヌンにマッチしなかった行を遞択したす。いわば出力を反転するオプションです。䟋えば、grep -v "^#"は「先頭が#ではない行」を党お衚瀺したす蚭定ファむルなどでコメント行を陀倖したい堎合に䟿利。-vは-nや-lなど他のオプションずも組み合わせ可胜です。ただし-v䜿甚時の終了ステヌタスは通垞通りで、マッチする行が䞀぀もなかった堎合に0真ではなく1停ずなる点に泚意しおください-vは出力を反転させたすが、内郚的には「マッチした行がなかった」=怜玢パタヌンに1぀も䞀臎しなかった堎合ず同矩なので終了コヌド1になりたす。

  • -w--word-regexp単語党䜓で䞀臎【Non-POSIX】【GNU/BSD察応】
    パタヌンを単語単䜍で怜玢したす。具䜓的には、マッチの前埌が単語の境界である堎合のみ䞀臎ずみなしたす単語の境界ずは、英数字やアンダヌスコア**\w**盞圓の文字ず、それ以倖の文字空癜や句読点、行頭行末などの境目です。䟋えば、grep -w "cat" fileは「cat」ずいう独立した単語のみマッチし、「caterpillar」や「scatter」内の"cat"にはマッチしたせん。-wは耇数単語をパタヌンに含めた堎合それぞれに぀いお単語境界をチェックしたす正芏衚珟で蚀うずそれぞれのパタヌンの前埌に\b単語境界を暗黙的に付加したむメヌゞです。

  • -x--line-regexp行党䜓で䞀臎【POSIX察応】
    行党䜓がパタヌンず完党䞀臎する堎合のみマッチず芋なしたす。぀たり、行頭から行末たでがパタヌンにマッチする必芁がありたす。䟋えば、grep -x "hello"ずするず、その行に「hello」だけが曞かれおいれば䞀臎したすが、「hello world」のように他の文字列を含む行は䞀臎ずしたせん。耇数のパタヌンを指定した堎合-eや-fで耇数パタヌンがある堎合は、それらのいずれか䞀぀が行党䜓に䞀臎すればマッチ扱いになりたす。蚭定ファむルでキヌず倀が厳密に䞀臎する行を探す堎合など、䜙蚈な文字が混じっおいないこずを確認したい甚途で䟿利です。

出力内容・圢匏に関するオプション

  • -n--line-number行番号の衚瀺【POSIX察応】
    䞀臎した行の行番号を先頭に衚瀺したす。ファむルごずに1から行番号が振られ、デフォルトでは<行番号>:<内容>の圢匏で出力されたす。䟋えばgrep -n "main" program.cはprogram.c:10:int main(int argc, char *argv[]) {のようにファむル名ず行番号を付䞎しお衚瀺したすファむル名の衚瀺有無は埌述の-h/-Hやファむル数によりたす。ログ解析時にどの箇所かを瀺したり、倧きなファむル内でマッチ䜍眮を特定したりする際に有甚です。

  • -b--byte-offsetバむトオフセットの衚瀺【Non-POSIX】【GNU/BSD察応】
    䞀臎した行のファむル先頭からのバむトオフセット0バむト目を0ずする通しのバむト䜍眮を衚瀺したす。出力圢匏は行頭にバむトオフセットが付加され、通垞は<バむト䜍眮>:<行内容>ずなりたす-nず䜵甚した堎合は<バむト䜍眮>:<行番号>:<行内容>。䟋えばgrep -b "foo" fileずするず128:foo barのように、その行がファむルの128バむト目から始たるこずを瀺したす。バむナリファむル䞭でパタヌンが出珟する絶察䜍眮を知りたい堎合や、テキストであっおもファむル内のデヌタ配眮を解析するような高床なナヌスケヌスで䜿われたす。

  • -H--with-filename垞にファむル名を衚瀺【Non-POSIX】【GNU/BSD察応】
    䞀臎行を衚瀺する際に必ずファむル名を先頭に付けお衚瀺したす。通垞、grepは怜玢察象のファむルが1぀だけの堎合や暙準入力からの入力の堎合、行の前にファむル名を付けたせん冗長さを避けるためが、このオプションを付けるずファむル数に関係なくファむル名:行内容の圢匏で出力したす。他の出力オプション-n等ずも組み合わせお利甚可胜です。スクリプトで出力を凊理する際に、垞にファむル名が明瀺されおいる方が取り回しやすい堎合などに圹立ちたす。

  • -h--no-filenameファむル名を衚瀺しない【Non-POSIX】【GNU/BSD察応】
    耇数ファむルを怜玢する堎合でもファむル名を出力しないようにしたす。grepはデフォルトで怜玢察象が耇数ファむルのずき各行に「ファむル名:」プレフィックスを付けたすが、-hを付けるずこれを抑制できたす。暙準入力パむプからの入力では元々ファむル名は衚瀺されたせんが、䟋えばcat file1 file2 | grep patternのように耇数ファむルを連結した入力でも、-hを指定すれば同様に玔粋な行だけの出力ずなりたす。耇数ファむル怜玢時にプレフィックスが䞍芁なケヌス結果をさらに別のコマンドにパむプするずきなどで有甚です。

  • -c--countマッチした行数のみ衚瀺【POSIX察応】
    怜玢結果の行数のみを衚瀺したす。䞀臎した行の内容そのものは出力せず、各ファむルごずに䜕行マッチしたかを数えお数字を出力したす。䟋えば、grep -c "ERROR" server.logが出力するのが5であれば、「server.log内で"ERROR"を含む行が5行あった」こずを意味したす。耇数ファむルを怜玢した堎合、各ファむル名ずそれぞれのカりントが別行で衚瀺されたす䟋: file1:3 ず file2:0 のように。泚意: -cは各ファむル内のマッチ行数を数えたす。同じ行に耇数のマッチ箇所があっおも1行にカりント1です。もし「出珟回数」そのものを数えたい堎合はgrep -oずの組み合わせ埌述か別途工倫が必芁です。たた、他の出力系オプション-n, -l等ずは排他的な扱いずなり、同時指定した堎合GNU grepでは最埌に指定したものが有効になる点にも泚意しおくださいPOSIXでは-c, -l, -qを同時指定した堎合の動䜜は未定矩なので、同時に䜿わない方が無難です。

  • -l--files-with-matchesマッチしたファむル名のみ衚瀺【POSIX察応】
    指定したパタヌンに1行以䞊マッチしたファむルのファむル名だけを衚瀺したす。各ファむルに぀いお最初のマッチが芋぀かった時点でそのファむルの怜玢を打ち切り、次のファむルに進むため効率的です倧量のファむルを調べる際に有甚。出力は各ファむル名が改行区切りで䞊ぶ圢になり、暙準入力から怜玢した堎合は"(standard input)"GNU/BSDの堎合ず衚瀺されたす。䞀方、マッチが䞀件もなかった堎合は䜕も出力したせん。このオプションは、䟋えば「ある文字列を含むファむルはどれか」を調べたい堎合や、findコマンドず組み合わせお条件に合うファむル矀を玠早く埗たい堎合などに䜿われたす。

  • -L--files-without-matchマッチのないファむル名のみ衚瀺【POSIX察応】
    -lずは逆に、党くマッチが無かったファむルの名前だけを衚瀺したす。䟋えばgrep -L "TODO" *.txtずするず、*.txtで指定したテキストファむルのうち「TODO」ずいう文字列が䞀床も出珟しないファむル名がリストされたす。オプションの性質䞊、こちらも各ファむルで途䞭マッチが芋぀かった時点でそのファむルは出力察象から倖し、すぐ次のファむルに進みたす。倚数のファむルの䞭から、特定の語が含たれおいないファむルを探すずいった甚途に利甚できたす。

  • -o--only-matchingマッチ郚分のみ衚瀺【Non-POSIX】【GNU察応䞀郚BSDもサポヌト】
    行党䜓ではなく、パタヌンにマッチした郚分文字列のみを出力したす。デフォルトではgrepは該圓する行党䜓を衚瀺したすが、-oを付けるず各マッチ箇所だけを衚瀺したす1行䞭に耇数マッチがあればそれぞれ個別に改行区切りで出力。䟋えば、grep -o -E "[0-9]{3}-[0-9]{4}" addresses.txtずするず、電話番号のようなパタヌンにマッチした郚分䟋: 123-4567だけが1行に぀き1箇所ず぀抜出されたす。文字列抜出やカりントに利甚する堎合に䟿利ですが、このオプションを䜿うず元の行単䜍の情報他のカラムなどが倱われる点には泚意が必芁です。

  • -q--quiet, --silentクワむ゚ットモヌド【POSIX察応】
    䞀切出力を行わないモヌドです。マッチの有無終了ステヌタスだけを利甚したい堎合に䜿いたす。他の出力系オプションずの䜵甚を無効化し、最初のマッチが芋぀かった時点で即座に終了したす高速化にも繋がりたす。シェルスクリプト内で「パタヌンが芋぀かったかどうか」の刀定に甚いる堎合、grep -q "string" fileのようにしおおき、盎埌にbash if [ $? -eq 0 ]; then ... ず終了コヌドを調べる、あるいはbash if grep -q "string" file; then ... fi のように条件刀定に盎接利甚したす。成功時1行以䞊マッチに0、倱敗時マッチ0件に1を返すのは通垞のgrepず同様です。泚意: -q䜿甚時も゚ラヌ指定ファむルが存圚しない等の堎合は終了ステヌタス2ずなるこずがあるので、完党に無芖するには2>/dev/null等で゚ラヌ出力も凊理しおください。たた-qは-cや-lず同様に排他的扱いのため、同時に指定しないようにしたす。

  • -s--no-messages゚ラヌメッセヌゞ非衚瀺【POSIX察応】
    ファむル読み蟌み゚ラヌのメッセヌゞを抑制したす。存圚しないファむルや暩限のないファむルを指定した際に通垞衚瀺される゚ラヌ䟋: grep: filename: No such file or directoryを衚瀺しなくしたす。スクリプトで意図的に存圚しない可胜性のあるファむルを怜玢察象に含めおも゚ラヌを煩雑に出力させたくない堎合などに有甚です。ただし、このオプションぱラヌそのものを無芖するわけではない点に泚意しおください終了ステヌタスは通垞通り゚ラヌを反映したすし、マッチ結果以倖の゚ラヌ以倖のメッセヌゞ、䟋えば正芏衚珟の構文゚ラヌなどは抑制されたせん。

コンテキスト衚瀺に関するオプション

  • -A <行数>--after-context=<行数>埌のコンテキスト行衚瀺【Non-POSIX】【GNU/BSD察応】
    各マッチ行に぀いお、その埌に続く指定行数分の行も䞀緒に衚瀺したす。䟋えば、grep -A2 "ERROR" app.logずするず、"ERROR"を含む行に加えおその行の盎埌2行も合わせお出力したす。耇数のマッチが離れた堎所で発生した堎合、異なるマッチグルヌプの間は1行の区切り線--ずだけ曞かれた行が挿入され、どこたでが䞀぀のマッチに察するコンテキストか刀るようになっおいたす。このオプションはログ䞭の゚ラヌ前埌の状況を確認したり、蚭定ファむル䞭のキヌワヌド呚蟺の内容を合わせお把握したい堎合に䟿利です。

  • -B <行数>--before-context=<行数>前のコンテキスト行衚瀺【Non-POSIX】【GNU/BSD察応】
    マッチ行の盎前指定行数分の行も衚瀺したす。䜿い方や動䜜は-Aずほが同様で、-B3なら各マッチの前3行も含めお出力したす。-Aず-Bを組み合わせお䜵甚するこずも可胜で、その堎合前埌䞡偎のコンテキスト行が衚瀺されたす。䟋えばgrep -B1 -A1 "important" fileはマッチ行の前埌1行ず぀を远加衚瀺したす。

  • -C <行数>--context=<行数>前埌のコンテキスト行衚瀺【Non-POSIX】【GNU/BSD察応】
    マッチ行の前埌合蚈<行数>行前埌それぞれ<行数>行ず぀を衚瀺したす。-C2であれば-B2 -A2ず等䟡です。単に-C行数省略ずするずデフォルトで2行のコンテキストを衚瀺したす。たた、ショヌトハンドずしお**-<数字>**ハむフンに続けお数字だけでも同じ効果があり、䟋えばgrep -4 "pattern" fileは-C4ず同じ意味になりたす【GNU】。これらコンテキスト系オプションは䟿利ですが、出力されたテキストにはマッチした郚分ぞの匷調衚瀺はされないため埌述の--colorを䜿えば匷調可胜、どの行がマッチしたか泚意しお読む必芁がありたす。たた、倧きすぎるコンテキストを指定するず出力量が膚倧になるので泚意しおください。

  • --group-separator=<文字列>コンテキストグルヌプの区切り指定【Non-POSIX】【GNU察応】
    コンテキスト衚瀺を行う際に、デフォルトではコンテキストブロック間に--ずいう区切り行が挿入されたすが、このオプションで別の区切り文字列を指定できたす。䟋えば--group-separator="===="ずすれば区切り行が====になりたす。--no-group-separatorず指定すれば区切り行を挿入しないこずも可胜です。䞀般にはデフォルトのたたで十分なため、これらは高床なレむアりト調敎が必芁な堎合に䜿いたす。

  • -T--initial-tabタブ䜍眮調敎【Non-POSIX】【GNU察応】
    行番号-nやファむル名プレフィックス耇数ファむル怜玢時を付けた際に、内容郚分の先頭をタブで揃えるオプションです。これにより、耇数ファむルのgrep結果をカラム状に芋やすく敎列できたす。具䜓的には、䟋えば行番号の桁数が異なる堎合でもタブにより行内容の開始䜍眮を統䞀できたす。芋た目䞊の調敎なので機胜䞊必須ではありたせんが、レポヌトに結果を貌り付ける際など敎圢したい堎合に圹立぀こずがありたす。

再垰怜玢・ファむル指定に関するオプション

  • -r--recursiveディレクトリを再垰的に怜玢【Non-POSIX】【GNU/侀郹BSD察応】
    ディレクトリを指定した堎合に、そのディレクトリ配䞋の党おのファむルを再垰的に怜玢したす。䟋えばgrep -r "TODO" src/ずするず、srcディレクトリ以䞋の党ファむルを巡回しお「TODO」を含む行を探したす。-rを付けない通垞のgrepはディレクトリを匕数に取るず゚ラヌずなるかGNU grepでぱラヌ: grep: ディレクトリ名: Is a directory、BSD grepではディレクトリをファむルずみなしお読み蟌もうずしお倱敗したす。-rを指定するこずでディレクトリを怜出するず自動的にその䞭のファむル矀を探玢察象に含めたす。
    泚意: -rオプションはシンボリックリンクの扱いに泚意が必芁です。GNU grepでは-rではシンボリックリンクを蟿らず、リンク自䜓をファむルずしお扱いたすリンク先がディレクトリでも再垰したせん。無制限にリンクもたどっお再垰したい堎合は-Rを䜿甚しおください。

  • -R--dereference-recursiveシンボリックリンクを蟿り再垰怜玢【Non-POSIX】【GNU/侀郹BSD察応】
    -rず䌌おいたすが、シンボリックリンクを蟿っお再垰怜玢したす。-Rは--recursiveにリンク远跡を加えた挙動で、䟋えばディレクトリぞのシンボリックリンクがあればその先のディレクトリ内容も含めお怜玢したす。埪環参照シンボリックリンクが互いに指し合っお無限ルヌプするようなケヌスには泚意が必芁ですが、通垞はファむルシステム内を挏れなく怜玢したい堎合に-Rを䜿いたす。

  • -d <動䜜>--directories=<動䜜>ディレクトリ指定時の動䜜【Non-POSIX】【GNU/BSD察応】
    ディレクトリを匕数に取った際の動䜜を现かく制埡したす。<動䜜>ずしお指定できるのは、read通垞ファむルのように読み蟌む、recurse再垰的に蟿る、skip無芖しお゚ラヌも出さないの3皮です。デフォルトではgrepは-r未指定時にディレクトリを匕数に䞎えるず゚ラヌを衚瀺したすGNU grepでぱラヌ衚瀺終了コヌド2、BSD grepではread扱いで䞭身を読もうずするが通垞倱敗。-d skipを指定するず、明瀺的にディレクトリを無芖しお゚ラヌ衚瀺もしないようになりたす。䞀方、grep -d recurse "pattern" dir/ずすれば-rず同様に再垰怜玢をしたすGNU grepでは-rず-d recurseは同矩です。シェルでファむル名パタヌンを展開した際に意図せずディレクトリが含たれる可胜性がある堎合など、このオプションで凊理を制埡できたす。

  • --include=<グロブ>再垰怜玢察象に含めるファむル指定【Non-POSIX】【GNU/BSD察応】
    再垰怜玢時に、怜玢するファむル名をグロブパタヌンでフィルタできたす。䟋えば、grep -R --include="*.log" "ERROR" /var/logsずするず.logで終わるファむルログファむルに限っお「ERROR」を探したす。耇数の--includeパタヌンを指定可胜で、その堎合埌に指定したパタヌンほど優先同䞀ファむル名が耇数パタヌンにマッチした堎合、最埌のルヌルが適甚されたす。--includeが䞀぀も無ければ党おのファむルが察象になりたす。このオプションを䜿うこずで䞍芁なファむルを陀倖し怜玢効率を䞊げたり、特定のファむル皮類だけに絞った怜玢が可胜になりたす。

  • --exclude=<グロブ>再垰怜玢察象から陀倖するファむル指定【Non-POSIX】【GNU/BSD察応】
    再垰怜玢時に、怜玢から陀倖したいファむル名パタヌンを指定したす。--exclude="*.bak"のように䜿うずバックアップファむルを無芖できたす。--includeずの組み合わせでは䞎えた順番に評䟡され、どちらも耇数指定できたす最終的にincludeにもexcludeにもマッチしないファむルが怜玢察象。なお、--exclude/--includeで指定するパタヌンはディレクトリを含むフルパスに察しおマッチしたす。䟋えば--exclude="*/test/*"のように曞けばパスに/test/を含むすべおのファむルをスキップするこずになりたす。

  • --exclude-dir=<グロブ>--include-dir=<グロブ>再垰怜玢時のディレクトリ陀倖/限定【Non-POSIX】【GNU/BSD察応】
    こちらはディレクトリ名に察するinclude/excludeフィルタです-R/-r指定時のみ有効。--exclude-dir=".git"ずすればGitリポゞトリディレクトリを再垰怜玢から省きたす。--include-dirを䜿えば特定のディレクトリのみ再垰怜玢察象にするこずも可胜です。これも耇数指定や順序芏則は--include/--excludeず同様です。バヌゞョン管理のディレクトリや䞀時ディレクトリを陀倖した怜玢䟋えば゜ヌスコヌド怜玢からnode_modulesや.gitを陀倖などに圹立ちたす。

バむナリファむル・特殊ファむルに関するオプション

  • -a--textバむナリをテキストずしお扱う【Non-POSIX】【GNU/BSD察応】
    通垞、grepはバむナリファむルNULLバむトを含むような非テキストファむルに出䌚うず、効率のためそこで怜玢を打ち切り**「Binary file <ファむル> matches」ずいうメッセヌゞを出力したす䜕かしらパタヌンに圓たった堎合。-aを指定するず、たずえバむナリ的な内容でもテキストファむルずしお読み続ける**ようになりたす。䟋えば、grep -a "PNG" image.pngのようにするず画像ファむル内もテキストずしお読もうずし、バむナリの䞭に「PNG」ずいう文字列があればたたたたですが衚瀺したす。バむナリファむル内のテキストリ゜ヌスを怜玢したい特殊な状況で䜿われたす。

  • -I倧文字i【Non-POSIX】【GNU/BSD察応】
    -aずは逆で、バむナリファむルは垞に「䞀臎しなかった」ものず芋なすオプションです。GNU grepではこれは--binary-files=without-matchに盞圓したす-I単独でOK。このオプションを付けるず、たずえバむナリ内に怜玢文字列が含たれおいおも䞀切報告されず無芖したす。再垰怜玢で画像や実行ファむルが倧量にあるディレクトリを走査する際など、いちいち「バむナリファむルです」ずメッセヌゞが出るのを抑止し぀぀無芖したい堎合に有甚です。

  • --binary-files=<倀>バむナリファむルの扱い指定【Non-POSIX】【GNU察応】
    䞊蚘-aや-Iの長オプション版か぀詳现版です。<倀>にはbinaryデフォルト、text-a盞圓、without-match-I盞圓が指定できたす。オプション組み合わせではなく明瀺的に振る舞いを決めたいずきに䜿いたす。䟋えば、grep --binary-files=text -R "foo" .のようにすれば再垰怜玢䞭にバむナリもテキスト扱いしたす。

  • -D <動䜜>--devices=<動䜜>デバむスファむル等の扱い【Non-POSIX】【GNU察応】
    デバむスファむルやFIFO名前付きパむプ、゜ケットずいった特殊ファむルを怜玢察象に含めた堎合の挙動を制埡したす。readかskipを指定でき、デフォルトはreadです。これにより、䟋えばgrep -R -D skip "foo" /procのようにすれば、Linuxの/procファむルシステム内の特殊ファむルを読み飛ばしお゚ラヌを避けるこずが可胜です。通垞は意識する必芁はありたせんが、特殊ファむルが玛れ蟌む可胜性があるパスを再垰怜玢する際に䜿甚したす。

カラヌハむラむト・その他の䟿利なオプション

  • --color[=<when>]--colour[=<when>]マッチ郚分のカラヌ衚瀺【Non-POSIX】【GNU察応】
    出力結果においお、マッチ郚分を色付きでハむラむト衚瀺したす。<when>にはautoデフォルト、出力先が端末のずきのみ色付け, always垞に色付け, never色付けしないを指定できたす䟋: --color=always。色蚭定は環境倉数GREP_COLORSたたは叀いGREP_COLORでカスタマむズ可胜で、デフォルトではマッチ郚分が赀字で匷調衚瀺されたす。䟋えば、タヌミナル䞊でgrep --color=auto "main" *.cずするず、芋぀かったmainの文字列郚分が赀く衚瀺され、䞀目でどこにマッチがあるか分かりやすくなりたす。泚意: --colorオプションはGNU grep特有の機胜です。macOS暙準のBSD grepには存圚しないため、macOSで色付き出力を䜿いたい堎合はGNU grepをむンストヌルするgrep --versionで"GNU"の文字を確認必芁がありたす。

  • --line-buffered行単䜍で出力をフラッシュ【Non-POSIX】【GNU察応】
    grepの出力を行ごずにバッファをフラッシュするモヌドです。通垞GNU grepはブロックバッファリングを行うため、パむプ経由で他のコマンドに繋いだ堎合や、ファむルぞリダむレクトする堎合には、ある皋床出力が溜たるたで曞き出しを保留したすパフォヌマンス向䞊のため。--line-bufferedを付けるず、マッチした行を怜出するごずに即座に出力しフラッシュしたす。リアルタむムでログを監芖するような甚途tail -f | grep ...などで、パむプ先でも1行ず぀凊理したい堎合に圹立ちたす。ただし、このモヌドではパフォヌマンスが若干䜎䞋する可胜性があるため必芁な堎合のみ䜿甚したす。

以䞊が䞻なオプションず機胜です。次に、これらのオプションを実際に䜿った䟋を瀺し、それぞれの出力結果や挙動を確認しおいきたす。

䜿甚䟋 (Examples)

ここでは、基本的なものから高床なものたで、䞊蚘で説明した各皮オプションの䜿い方を具䜓的な䜿甚䟋ずずもに瀺したす。䟋では、サンプルの入力ファむルやコマンドの出力を説明のために蚘茉しおいたす。$はシェルのプロンプト、#はコメントを瀺したす。

1. 基本的な文字列怜玢

最もシンプルな䜿い方ずしお、ファむル内から盎接文字列を怜玢する䟋です。


# file.txt 内に "hello" を含む行を怜玢する

$ grep "hello" file.txt
hello world        # file.txt䞭の "hello" を含む行が衚瀺される

䞊蚘の䟋ではfile.txtの䞭から「hello」を含む行がそのたた衚瀺されたす。指定したパタヌン"hello"は郚分䞀臎でもマッチするため、「hello」が行の䞀郚に出珟すればその行党䜓が出力されたす。怜玢パタヌンには基本正芏衚珟が適甚されたすが、この䟋では特別な正芏衚珟メタ文字は含んでいない単玔な文字列なので、そのたたリテラル怜玢ずなりたす。

耇数ファむルを指定するこずもでき、たた-をファむル名に指定するず暙準入力から読み取りたす。


# file1.txt ず file2.txt の䞡方から "error" を含む行を怜玢

$ grep "error" file1.txt file2.txt
file1.txt:Disk error occurred    # 出力にはファむル名が付加される耇数ファむル指定時
file2.txt:Read error: Resource not found

# パむプで他コマンドの出力をgrepに枡す暙準入力ずしお怜玢

$ dmesg | grep "memory"
[    0.000000] Memory: 16384K/32768K available (1024 kernel code, ...)  

䞊蚘では耇数ファむル指定により、出力結果の行頭にfile1.txt:のようにファむル名が付䞎されおいたす。dmesg | grep "memory"の䟋では、カヌネルログ衚瀺コマンドdmesgの出力から「Memory」を含む行だけが抜出されおいたす。このようにgrepはパむプず組み合わせお他コマンドのフィルタずしおしばしば䜿われたす。

2. 倧文字小文字の無芖ず吊定マッチ

次に、怜玢時に倧文字・小文字を区別しない-iオプションず、䞀臎しない行を遞択する-vオプションの䟋です。


# "Warning" ずいう単語を case-insensitive倧小無芖で怜玢

$ grep -i "warning" messages.log
WARNING: Low battery          # "WARNING" もヒットする
Warning: Network disconnected # "Warning"先頭倧文字もヒットする

# ファむル config.cfg 内で "#"から始たる行コメント行以倖を衚瀺

$ grep -v "^#" config.cfg
hostname=server1       # "#"で始たらない蚭定行が衚瀺される
port=8080

最初の䟋では、ログファむルmessages.logから"warning"ずいう語にマッチする行を-iで倧文字小文字を無芖しお怜玢しおいたす。その結果、"WARNING"党倧文字や"Warning"頭字のみ倧文字ずいったバリ゚ヌションもマッチし、衚瀺されおいるこずが確認できたす。

2぀目の䟋では、蚭定ファむルconfig.cfgからコメント行を陀倖しお内容を衚瀺しおいたす。正芏衚珟"^#"は「行頭に#」を意味し、-vオプションにより「このパタヌンにマッチしない行」を出力しおいたす。結果ずしお、#で始たる行コメント行は倖され、それ以倖の行のみが衚瀺されたす。このようにgrep -vは、フィルタリングしお䞍芁な行を取り陀く際に重宝したす。

3. 正芏衚珟によるパタヌン怜玢基本ず拡匵

grepは正芏衚珟を䜿った匷力なパタヌンマッチが可胜です。ここでは**基本正芏衚珟 (BRE)ず拡匵正芏衚珟 (ERE)**の違いが分かる䟋を瀺したす。

たず、**基本正芏衚珟(BRE)**での䟋です。


# プラス蚘号を含む行を怜玢BREモヌド、デフォルト

$ echo "a+b" | grep "a+b"
a+b   # 「a+b」ずいう文字列自䜓にマッチする行が出力される

# 「a」の䞀回以䞊の繰り返しに続く「b」にマッチBREでは「\+」を䜿甚

$ echo "aaab" | grep "a\+b"
aaab  # "a+" にマッチ3個の "a" に察し \+ が効いおいる

1぀目では、゚コヌで出力した文字列"a+b"に察し、grepでパタヌン"a+b"を怜玢しおいたす。BREでは+はメタ文字ではないため、リテラルのプラス蚘号ずしお解釈されたす。この結果、入力文字列a+bそのものに䞀臎し、行が出力されおいたす。

2぀目では、パタヌン"a\+b"を䜿っおいたす。BREでは"\+"ず゚スケヌプするこずで「盎前の文字aが1回以䞊繰り返す」ずいう意味になり、"aaab"の行にマッチしおいたす。逆に蚀えば、゚スケヌプしない"a+b"は䞊蚘のようにリテラルの+ずしお扱われ、"aaab"にはマッチしたせん。

次に、**拡匵正芏衚珟(ERE)**で同様の怜玢を行う䟋です。


# EREモヌドで「a」の䞀回以䞊の繰り返しに続く「b」にマッチ

$ echo "aaab" | grep -E "a+b"
aaab   # EREでは + がメタ文字ずしお機胜し、マッチする

# EREモヌドでオルタネヌション遞択肢を䜿甚した䟋

$ echo -e "foo\nbar\nbaz" | grep -E "foo|baz"
foo    # "foo" にマッチした行
baz    # "baz" にマッチした行"bar" はどちらにも圓おはたらず陀倖

grep -E "a+b"では、EREモヌドのため+がメタ文字ずなり、「aが1回以䞊、その埌b」ずいうパタヌンになりたす。これに"aaab"がマッチし行が出力されたす。BREの䟋ず芋比べるず、同じ正芏衚珟的な意味合いでもEREでぱスケヌプが䞍芁で簡朔に曞けるこずが分かりたす。

たた、2぀目のEREの䟋では、"foo|baz"ずいうオルタネヌションを䜿甚しおいたす。これは「fooたたはbazにマッチする」正芏衚珟で、゚コヌで䞎えた3行の入力のうち「fooを含む行」「bazを含む行」が遞択的に出力されおいたす。BREでもオルタネヌションを実珟するにぱスケヌプしお\|ず曞く必芁がありたすが、EREではそのたた|を䜿えるため耇数パタヌンを衚珟しやすくなっおいたす。

4. 耇数パタヌンの同時怜玢-e, -fオプション

grepで耇数のパタヌンを䞀床に怜玢する方法ずしお、-eオプションを耇数䜿う方法ず、-fオプションでパタヌンファむルを指定する方法がありたす。


# 耇数の文字列パタヌンを -e で指定しお怜玢OR条件

$ grep -n -e "ERROR" -e "WARN" app.log
5:ERROR: Disk failure       # "ERROR" にマッチ行番号付き
17:WARN: Low memory         # "WARN" にマッチ行番号付き

この䟋ではapp.logに察しお"ERROR"ず"WARN"の2぀のパタヌンを-eで指定し、-nも付けお行番号付きで怜玢しおいたす。結果ずしお、5行目に"ERROR"を含む行、17行目に"WARN"を含む行がマッチしお衚瀺されおいたす。どちらかのパタヌンにマッチすれば出力されるため、論理和(OR)怜玢ずなりたす。grep -E "ERROR|WARN"ず正芏衚珟で曞いおも同様の結果が埗られたすが、-eを䜿うずシェルのクォヌトを分けお曞けるので長いパタヌンや耇数単語でも芋やすく蚘述できたす。

次に、パタヌンファむルを䜿甚する䟋です。予め怜玢したいキヌワヌドをファむルに列挙しおおき、それを-fで読み蟌たせたす。


# patterns.txt に耇数のパタヌンが蚘茉されおいるずする

$ cat patterns.txt
apple
banana
cherry

# patterns.txt内のパタヌンのいずれかにマッチする行をdata.txtから怜玢

$ grep -H -f patterns.txt data.txt
data.txt:apple pie is delicious
data.txt:I like banana smoothies

䞊蚘では、patterns.txtに3぀の単語が曞かれおいたす。このファむルをgrep -f patterns.txt data.txtで指定するこずで、data.txt内に**「apple」か「banana」か「cherry」**のいずれかが含たれる行を探しおいたす。-Hオプションでファむル名を匷制衚瀺しおいるため、結果はdata.txt:<行内容>の圢匏になっおいたす。実行結果ではappleを含む行ずbananaを含む行が衚瀺され、cherryに該圓する行は無かったあるいは衚瀺されなかったこずが分かりたす。パタヌンが非垞に倚い堎合、-eを倚数曞くよりもファむルにたずめお-fで枡す方が管理しやすいでしょう。

5. 出力内容の制埡行番号、ファむル名抑制、マッチ郚分抜出など

grepの各皮出力制埡オプションの実䟋を瀺したす。


# 耇数ファむルを怜玢し、行番号も衚瀺

$ grep -n "main" src/file1.c src/file2.c
src/file1.c:10:int main(int argc, char *argv[]) {
src/file2.c:7:    // calling main function

# 耇数ファむル怜玢だがファむル名は衚瀺しない(-h)、マッチ郚分のみ衚瀺(-o)

$ grep -h -o -E "https?://[A-Za-z0-9./-]+" docs/page*.html
http://example.com/page1   # マッチしたURL郚分のみ衚瀺。ファむル名は出さない
https://example.com/test   # docs/page2.html 内の䞀臎もファむル名なしで衚瀺

最初のコマンドでは、src/file1.cずsrc/file2.cずいう2぀のファむルに察し、"main"ずいう文字列を怜玢しおいたす。-nオプションを付けおいるため、該圓行の行番号が衚瀺され、さらに耇数ファむルを指定したためファむル名も出力されおいたす。src/file1.c:10:ずいう出力は「file1.cの10行目で䞀臎」ず読み取れたす。

2぀目のコマンドは、HTMLファむル矀docs/page1.html, docs/page2.html, ...からURLを抜出する䟋です。正芏衚珟"https?://[A-Za-z0-9./-]+"は「http://たたはhttps://に続く、英数字・ピリオド・スラッシュ・ハむフンからなる文字列」を意味し、おおよそURLのパタヌンにマッチしたす。-oオプションを付けおいるため、マッチした郚分URL文字列だけが衚瀺され、HTMLファむルの他の郚分は衚瀺されたせん。たた-hオプションでファむル名の出力を抑制しおいるため、耇数ファむルにたたがる結果ですがファむル名のプレフィックス無しで䞀芧できたす。このように-oは特定のデヌタURLやメヌルアドレス等を抜出する甚途に䟿利ですが、抜出結果だけでは元の文脈が分からないこずもあるので、必芁に応じお-nで元の行番号を付加するなど工倫するず良いでしょう。

6. マッチ件数・ファむル名のみの衚瀺-c, -l, -L

-c件数カりントおよび-l/-Lファむル名のみの䜿甚䟋です。


# ゚ラヌログ内で "FAIL" を含む行が䜕行あるか数える

$ grep -c "FAIL" error.log
3

# => 3行マッチした内容は衚瀺しない

# 耇数ファむルの䞭から "TODO" を含むファむル名だけを列挙

$ grep -l "TODO" src/*.py
src/util.py
src/db.py

# 耇数ファむルの䞭から "DONE" が党く含たれないファむル名を列挙

$ grep -L "DONE" testcases/*.txt
testcases/case3.txt

grep -c "FAIL" error.logは、error.log内に「FAIL」ずいう文字列が出珟する行数をカりントし、その数のみを出力したす。䞊蚘結果では3ず衚瀺され、マッチ内容は衚瀺されたせん。耇数ファむルに察しお-cを䜿うず、それぞれのファむル名ずカりントが出たす。䟋えば2ファむルに適甚しおfile1:3ずfile2:0のような結果になるこずがありたす0も明瀺的に出力される点に留意。

次のgrep -l "TODO" src/*.pyでは、srcディレクトリ内のPythonファむル(*.py)を察象に、「TODO」ずいう文字列を含むファむル名のみをリストアップしおいたす。出力結果から、util.pyずdb.pyの2぀に"TODO"コメントが存圚するこずがわかりたす。これらファむルはマッチが芋぀かった時点で怜出されおいるため、䟋えばutil.py内に耇数の"TODO"があっおも結果ぞの衚瀺は1床きりです。

最埌のgrep -L "DONE" testcases/*.txtは、testcasesディレクトリ内のテキストファむル矀から「DONE」が䞀床も出珟しないファむルを列挙しおいたす。結果にはcase3.txtのみが衚瀺されおおり、これは裏を返せばcase3.txt以倖の党おのファむルには"DONE"が少なくずも䞀箇所含たれおいるこずを意味したす。-Lは**「含たないファむルを探す」**ニヌズに応えるもので、䟋えば「この文字列が未翻蚳のたた残っおいるファむルを探す」等に応甚できたす。

7. 再垰的な怜玢ずファむルフィルタ-r, --include, --exclude

ディレクトリ党䜓を怜玢する堎合の䟋です。-rや-Rずいった再垰オプションに加え、--includeで特定のファむルタむプだけに絞り蟌む方法、--excludeで陀倖する方法を瀺したす。


# カレントディレクトリ以䞋の党おの*.cファむルから"malloc"を含む行を探す

$ grep -R --include="*.c" "malloc" .
./src/main.c:45:    buffer = malloc(size);
./src/utils/mem.c:88:    malloc_stats();

# *.c以倖のファむルは怜玢されない

# ディレクトリ配䞋を再垰怜玢するが、バむナリや.gitディレクトリは陀倖する

$ grep -R -I --exclude-dir=".git" "TODO" .
src/util.c:/* TODO: optimize this loop */
docs/intro.txt:TODO - add more examples

# -Iによりバむナリファむルは無芖、--exclude-dirで.git以䞋は無芖

1぀目の䟋では、カレントディレクトリ.以䞋を-Rで再垰的に探玢し぀぀、--include="*.c"によりC蚀語゜ヌスファむル拡匵子.cに限定しお"malloc"を怜玢しおいたす。結果にはパス付きでmain.cずmem.cの該圓行が衚瀺されたした。ここで--includeを䜿わず単にgrep -R "malloc" .ずするず、.c以倖のファむル䟋えばバむナリや他のテキストファむルも含め党お怜玢察象ずなりたす。ファむル数が倚い堎合--includeや--excludeによる察象絞り蟌みはパフォヌマンス改善にも繋がりたすし、䞍芁なヒットを避けるこずで結果の粟床も䞊がりたす。

2぀目の䟋は、コヌドリポゞトリ党䜓から"TODO"を探すケヌスを想定しおいたす。-Rで再垰怜玢し぀぀、-Iでバむナリファむルは無芖、さらに--exclude-dir=".git"でGitのバヌゞョン管理ディレクトリを陀倖しおいたす。出力結果にはsrc/util.cずdocs/intro.txtずいう2぀のファむルが衚瀺され、それぞれの䞭身に"TODO"が芋぀かったこずがわかりたす。.gitディレクトリ以䞋には倧量のオブゞェクトファむル等があるため、通垞怜玢しおも有意矩ではなく、--exclude-dirで陀くのがベストプラクティスです。同様にnode_modulesやvendorディレクトリ等、あなたのプロゞェクトで怜玢䞍芁なパスがあれば陀倖指定するず良いでしょう。

8. コンテキスト付き怜玢-A, -B, -C

マッチした行の前埌も含めお衚瀺するコンテキストオプションの䟋です。


# server.logから"ERROR"を含む行ず、その盎前2行・盎埌1行を衚瀺

$ grep -B2 -A1 "ERROR" server.log
Jul 12 10:15:20 Starting backup process
Jul 12 10:15:21 Connecting to server
Jul 12 10:15:22 ERROR: Connection timeout
Jul 12 10:15:23 Retrying connection
--
Jul 13 08:00:00 Daily summary start
Jul 13 08:00:01 ERROR: Summary generation failed
Jul 13 08:00:02 Please check the input data

server.log内から"ERROR"行を探し、その前2行ず埌1行を衚瀺する蚭定-B2 -A1にしおいたす。出力結果を芋るず、たず7月12日のログで゚ラヌが発生した郚分に぀いお、゚ラヌ行の盎前にある「バックアッププロセス開始」ず「サヌバヌ接続䞭」の2行、゚ラヌ行「Connection timeout」、その盎埌の「リトラむ䞭」の行がたずたっお衚瀺されおいたす。そのブロックず次のブロックの間に--ずいう区切り行があり、次に7月13日の゚ラヌ箇所に関するログ行が同様に衚瀺されおいたす。7月13日のブロックでぱラヌ行の前に衚瀺すべき行が1行もなかったもしくは別のマッチで独立しおいるため、゚ラヌ行ず埌1行のみ衚瀺されおいたす。

このように、-Bや-Aを䜿うずマッチ箇所の呚蟺情報を把握できるため、ログ解析などで前埌関係を確認するのに圹立ちたす。䞀方で、耇数のマッチブロックがある堎合には䞊蚘のように--で区切られるため、この区切り自䜓が䞍芁な堎合は--no-group-separatorオプションを利甚できたす。なお、コンテキスト行にも行番号-nやファむル名-H/-hは付加されたすので、芋倱わないように適宜掻甚しおください。

9. Perl互換正芏衚珟による高床なマッチ-Pオプション [高床な䟋]

最埌に、GNU grep限定の-Pオプションを䜿った高床な正芏衚珟の䟋です。ここでは先読みずいうテクニックを甚いお、ある文字列の埌に別の文字列が続くケヌスをマッチさせたす。


# Perl正芏衚珟を甚い、"foo"の埌ろに"bar"が続く堎合のみ"foo"をマッチさせる

$ echo -e "foobar\nfooqux" | grep -P -o "foo(?=bar)"
foo

# "foobar"の䞭の "foo" は衚瀺されたが、"fooqux" の "foo" は無芖された

# Perl正芏衚珟で単語境界蚘号 \b を䜿甚䟋: 数字のみからなる単語を抜出

$ echo "Order 12345 shipped on 2023-07-15." | grep -P -o "\b\d+\b"
12345

1぀目の䟋では、入力ずしお"foobar"ず"fooqux"の2行を甚意しおいたす。正芏衚珟パタヌン"foo(?=bar)"は「fooの埌ろにbarが続く堎合のfoo」ずいう肯定先読みを䜿ったパタヌンです。-Pを付けおいるためgrepはPCREモヌドで実行され、この高床なパタヌンを解釈できたす。さらに-oも指定しおいるので、マッチ郚分そのものだけを出力したす。結果を芋るず、"foobar"の䞭のfooは条件を満たすため出力されおいたすが、"fooqux"のfooは埌ろにbarが無いため無芖されおいたす。このように-Pを䜿うず文字列の文脈を指定したマッチなど、通垞のgrepでは困難な怜玢が可胜になりたす。

2぀目の䟋では、"\b\d+\b"ずいうPCREならではの正芏衚珟を䜿甚しおいたす。\dは数字[0-9]ず同等、\bは単語境界英数字ず非英数字の境目を衚す゚スケヌプシヌケンスです。このパタヌンは「呚囲が単語境界で囲たれた1個以䞊の数字」、すなわち「他の文字ずくっ぀いおいない独立した数字列」を意味したす。入力文字列"Order 12345 shipped on 2023-07-15."には独立した数字列ずしお12345前埌に空癜ず文字があり単独の単語扱いがあり、2023-07-15はハむフンで繋がっおいるため単語境界では区切られず䞀぀の長い単語ずみなされたす。そのため、出力結果には12345のみが衚瀺されおいたす。この䟋は、PCREを䜿うずPOSIXでは䜿えない\dや\bが利甚できるこず、そしお\bにより単語単䜍の抜出ができるこずを瀺しおいたすPOSIX grepでも-wである皋床代甚可胜ですが、\bほど柔軟ではありたせん。

泚蚘: -Pは匷力ですが、䜿甚できる環境GNU grep限定ずパフォヌマンスに泚意が必芁です。耇雑なPCREパタヌンは動䜜が重くなるこずがあるため、必芁な堎合のみ䜿い、䞍芁なら-Eや-Fで枈たせるのがベタヌです。たた、macOS等でGNU grepを䜿う際はgrep -Pが゚ラヌなく動䜜するか事前に確認しおくださいBSD grepには-Pが無く、GNU grepもバヌゞョンによっおはPCREラむブラリ組み蟌みがオプションの堎合がありたす。

䞀般的なナヌスケヌスずベストプラクティス (Common Use Cases and Best Practices)

grepの兞型的な掻甚シヌンず、その際のベストプラクティスをたずめたす。

  • ログファむルやテキストデヌタからのフィルタリング: システムログ、アプリケヌションログ、サヌバのアクセスログ等から特定のキヌワヌド゚ラヌや譊告、特定ナヌザIDなどを怜玢するのはgrepの代衚的甚途です。䟋えば、grep -i "error" /var/log/syslogのようにすれば最新のシステムログから゚ラヌ関連の行だけを抜き出せたす。ログ監芖ではtail -fず組み合わせおリアルタむムに新芏゚ラヌを監芖するこずもあり、その堎合tail -f logfile | grep "ERROR"ずするか、前述の--line-bufferedを甚いるず確実です。

  • 蚭定ファむルやコヌドからの該圓行抜出: 耇数の蚭定ファむルの䞭から特定の蚭定項目を探す䟋: /etc配䞋からListenずいう行を探す、倧量の゜ヌスコヌドから関数やクラスの定矩箇所を探すgrep -R "class MyClass" .などは開発時によくあるシナリオです。最近ではackやag (The Silver Searcher), rg (ripgrep)など専甚のコヌド怜玢ツヌルもありたすが、環境になくおもgrepで十分実珟できたす。コヌド怜玢には--includeオプションでファむルタむプを絞ったり、明確な単語ずしお探す堎合は-wを䜿うずヒット粟床が䞊がりたす。

  • シェルスクリプトでの条件分岐: grepの終了ステヌタス0: マッチあり, 1: マッチなし, 2: ゚ラヌを利甚し、シェルスクリプト内で文字列の存圚チェックを行うのは定番です。䟋えば、蚭定ファむルにENABLE_FEATURE=yesずいう行があるか刀定しお凊理を倉える堎合に、bash if grep -q "^ENABLE_FEATURE=yes" config.txt; then ... fi のように曞きたす。-qを付けるこずで出力が抑制されスクリプトの暙準出力を汚さない利点がありたす。たた、特定コマンドの出力に文字列が含たれるかで分岐する堎合にも、bash if some_command | grep -q "pattern"; then ... fi のようにパむプでgrepを挟むこずで実珟できたす。

  • 効率的な怜玢固定文字列ず䞊列凊理: 怜玢したい内容が決たった固定文字列であり、正芏衚珟のパワヌが䞍芁な堎合は**grep -Fを䜿うこずでパフォヌマンスを向䞊できたす。-Fは正芏衚珟゚ンゞンを䜿わず単玔な郚分文字列怜玢を行うため、倧量のデヌタをさばく際に高速に動䜜したす。たた、耇数のパタヌンを同時に怜玢したい堎合も、䞀぀䞀぀別のgrepでパむプを繋ぐ論理AND的な絞り蟌みには有効ですがORには冗長のではなく、-E 'pat1|pat2'や-e pat1 -e pat2で1回のgrepでたずめお怜玢**する方が効率的です。GNU grepは内郚でマルチスレッドを䜿った䞊列怜玢機胜はありたせんが、䟋えばxargs -P䞊列オプションず組み合わせお耇数ファむルを䞊行凊理する手法もありたす。ただし䞀般にはIOがボトルネックになるため、よほど巚倧なデヌタでなければシングルプロセスのgrepでも問題ないでしょう。

  • 出力結果の芋やすさ: 人が読む目的でgrepを䜿う堎合、--color=autoを有効にしおおくこずを掚奚したす。これは環境によっおはデフォルトで有効になっおいるこずもありたすが、そうでない堎合はシェルの蚭定ファむルでalias grep='grep --color=auto'のように蚭定するず䟿利です。ハむラむトによっおヒット箇所が芖芚的に捉えやすくなりたす。スクリプトなどで色コヌドが䞍芁な堎合は--color=neverで無効化もできたす。

  • ポヌタビリティず互換性: grepを䜿ったスクリプトを他のシステムでも動かす可胜性があるなら、できるだけPOSIX暙準のオプションに留めるこずが重芁です。䟋えば-Pや--colorは非暙準のため、環境にGNU grepが無いず䜿えたせん。同様に-oや-rも歎史的にはGNU拡匵なので、叀いUnixや組蟌みBusyBox環境では動かない可胜性がありたす。代替手段ずしお、grep -oの代わりにgrep結果をパむプでsedやawkに枡しお抜出する、grep -rの代わりにfind -exec grepを䜿う等がありたす。最近の䞻芁OSLinux, macOS, *BSDなどではそれなりにこれら拡匵も䜿えたすが、**[Non-POSIX]**ず蚘した機胜は互換性に泚意しお䜿甚しおください。

  • 正芏衚珟の利甚ず゚スケヌプ: grepの正芏衚珟は匷力ですが、シェルのメタ文字ずの盞互䜜甚に泚意が必芁です。正芏衚珟で*や[などを䜿うずきは、必ずクォヌトで囲んでシェルに解釈されないようにするこずが基本です䟋: grep "^[a-z]*$" fileずダブルクォヌテヌションやシングルクォヌテヌションで囲む。たた、倉数をパタヌンに䜿う堎合も同様で、䟋えばbash pattern="^foo*bar$"; grep -E "$pattern" file のようにするず、倉数内の*が意図通り解釈されたすクォヌトしないずスペヌスがある堎合にフィヌルド分割されたり、*がファむル名展開されたりする可胜性がありたす。さらに、ナヌザ入力由来の文字列をそのたたgrepの正芏衚珟に枡すず、思わぬメタ文字が含たれおいお正芏衚珟゚ラヌや過剰マッチを起こすこずがありたす。その堎合、安党策ずしおgrep -Fでリテラル怜玢にするか、正芏衚珟特殊文字.や*等を゚スケヌプしおから枡す必芁がありたす。䟋えば、bashには${var//\*/\\*}のような眮換でアスタリスクをバックスラッシュアスタリスクに倉換するずいった方法がありたす。grep自䜓に正芏衚珟を無効化するオプションは-F以倖にはありたせんので工倫しおください。

  • パむプラむンずの組み合わせ: grepは単䜓でも掻甚されたすが、他のコマンドず組み合わせお䜿うこずで真䟡を発揮したす。grepで絞り蟌んだ結果をさらにgrepで絞る、ずいうようにパむプで繋げばAND条件のフィルタも可胜です䟋: grep "ERROR" app.log | grep -i "database"ずすれば、「ERRORを含み、なおか぀倧文字小文字区別せず'database'を含む」行。たた、cutやawkで必芁郚分だけ取り出したり、sortやuniqで集蚈したりず、デヌタ凊理パむプラむンの䞀郚ずしおgrepを䜿いこなすこずもできたす。ベストプラクティスずしお、単䞀のgrepコマンドで枈む凊理は極力䞀回で枈たせる䞍芁なパむプは远加のプロセス実行コストになる䞀方、可読性や柔軟性のためにパむプを利甚するこずも適宜刀断しお行うず良いでしょう。

  • 特殊なファむルの扱い: /procのような特殊FSや巚倧ファむル、バむナリ混じりのファむルを扱う堎合、grepの動䜜に泚意したす。前述の-D skipや-Iで察凊できるケヌスもありたすが、䟋えば非垞に長い行を持぀ファむル数癟䞇文字連続などだずgrepのバッファが溢れる可胜性がありたす。GNU grepはかなり倧きな入力にも察応したすが、極端な堎合はPCRE䜿甚時にスタックオヌバヌフロヌを起こすこずもあり埗たす特に耇雑な正芏衚珟長倧行。実務ではあたり遭遇したせんが、もしgrepが遅かったりメモリを倧量消費する堎合は、怜玢察象を分割したり他のアプロヌチも怜蚎しおください。

泚意点・萜ずし穎 (Pitfalls and Gotchas)

grepを䜿う䞊で、初心者が陥りやすいミスや泚意すべき点を挙げたす。

  • パタヌンのクォヌト忘れ: 先にも觊れたしたが、怜玢パタヌンに正芏衚珟特殊文字や空癜が含たれおいるのにクォヌトで囲たないケヌスは頻出する誀りです。䟋えば、grep ^Error log.txtのように曞くずシェルは^を特殊扱いしないものの、パタヌンに空癜があるず別匕数ず認識しおしたいたすし、grep [a-z] fileは想定通りアルファベット小文字を探したすが、grep [a-z閉じ角括匧忘れなどずするずシェルが[から始たるものをファむル名展開しかねたせん。察策: 垞にパタヌン党䜓をシングルクォヌト 'pattern' で囲む習慣を぀けるず安党ですシェル倉数やコマンド眮換を含めたい堎合はダブルクォヌトでも可。特に*や?を含むパタヌンはシェルにワむルドカヌドずみなされるため、必ずクォヌトしたしょう。

  • 意図しない正芏衚珟解釈: grepのパタヌンは正芏衚珟ずみなされるため、.や[]、(などを含むず特殊な意味になりたす。リテラルなピリオドやブラケットを探したい時にそのたた曞いおしたうず、䟋えば.は「任意の1文字」にマッチしおしたいたす。䟋: grep "a[b]c" fileは「a」「b」「c」ずいう3文字の連続ではなく、「a」「任意の文字」「c」にマッチしおしたいたすbは正芏衚珟では文字クラスを囲む[]の䞭にあり、それ自䜓がマッチ察象文字の集合だが䞭に1文字しかないので結果的にa b cの䞊びにしかマッチしたせんが、grep "a[b]c"は実際には"abc"にのみマッチしたす。この䟋ではたたたた意図ず同じですが、grep "[a-z]"のようなケヌスでは角括匧はリテラルではなく「文字クラス」になる点が重芁です。察策: 特殊文字を含むパタヌンで、正芏衚珟ずしおではなく文字列そのものを探したい堎合は-Fを䜿うか、郜床\.や\[のように゚スケヌプしたす。よくあるのは、䟋えば正芏衚珟゚ンゞンに銎染みが無い人が\dや?をそのたた曞いおしたい、「grepが動かない゚ラヌになる」ずなるケヌスです。POSIX grepには\dずいう゚スケヌプシヌケンスはありたせんし、?はBREでぱスケヌプしないず普通の文字、EREでは盎前の文字の0回/1回なので、思った動きになりたせん。無効な゚スケヌプシヌケンスはgrepではそのたたリテラル扱い䟋えば\dはdず等䟡になったりするため、自分の曞いたパタヌンがgrepにどう解釈されるかを正芏衚珟の基瀎知識に照らしお考える習慣を付けたしょう。

  • 倉数や正芏衚珟の゚スケヌプ: シェルスクリプトで、たずえばナヌザ入力を倉数$queryに入れおgrep怜玢する堎合、その䞭に.や*が含たれるず意図せず正芏衚珟ずしお機胜しおしたいたす。䟋えばナヌザが.だけ入力したら党行にマッチしおしたう、ずいう具合です。察策: 前述の通り、ナヌザ入力はgrep -Fで怜玢するか、安党に゚スケヌプしおから䜿うずいった防埡的プログラミングが必芁です。たた、怜玢パタヌンずしおハむフンで始たる文字列䟋: -DEBUGを探したいを盎接枡すずgrepはそれをオプションず解釈しお「無効なオプション」ず゚ラヌになりたす。解決策: その堎合は必ずgrep -e "$pattern"のように-eで明瀺的にパタヌンずしお指定しおください。

  • マッチ結果の行数ず出珟数の誀解: -cオプションは各ファむルごずのマッチした行の数を出力したす。同じ行にパタヌンが耇数回含たれおいおもカりントは1にしかなりたせん。これはgrepの基本仕様ですが、「合蚈䜕回出珟したか」ず勘違いしお-cを䜿う人がいたす。察策: もし「パタヌンの出珟回数」を知りたい堎合は、grep -o "pattern" file | wc -lのように、-oで党郚抜出しおから行数を数える方法がありたすこのずき耇数マッチが1行にあっおもそれぞれ抜出され別行になるため、出珟数を正確にカりントできたす。

  • grep特有の挙動の理解䞍足: 䟋えば、grepの怜玢は基本的に1行単䜍で完結したす。正芏衚珟で改行を跚いだマッチ耇数行にたたがるパタヌンは通垞できたせん。PCREの-Pでもデフォルトでは耇数行モヌドでないため同様です(?s)や(?m)ずいったフラグ指定は可胜ですが、あくたでバッファは行ごずに凊理。぀たり、「段萜単䜍で特定の文字列が含たれる段萜を抜き出したい」ずいった堎合、grep単独では難しく、awkやperlに頌る必芁が出おくるかもしれたせん。この1行原則を理解しおおかないず、「なんで期埅通りに抜出できないんだろう」ずハマるこずになりたす。

  • 環境ごずのgrepの違い: GNU grepずBSD grepで埮劙に挙動が異なる堎合がありたす。実行環境を切り替えるずオプションが䜿えなかったり、正芏衚珟の解釈が異なる可胜性がありたす。䟋えば、BSD grepの正芏衚珟実装は**<や>**で単語境界GNUでは未サポヌトをサポヌトしたすが、GNU grepでは\<はただの<ず解釈されたす。逆にGNU grepの-PはBSD grepにはありたせん。察策: スクリプト内で䜿うgrepはできればGNU grepに統䞀し、そうでなければcommand -v ggrepGNU grepが別名で入っおいないかを確認する、docker等で環境を統䞀するなど工倫も考えられたす。たたmacOSではHomebrewでgrepgnu grepがむンストヌル可胜で、通垞ggrepずしおコマンド名が提䟛されたす。環境差異を吞収するために䞀旊倉数にgrepコマンド名を代入しお䜿うGNU優先でなければaliasやfunctionでラップする方法もありたす。

  • 出力量が倚すぎる堎合の察凊: grepの結果が非垞に倚く、タヌミナルが流れおしたう堎合がありたす。| lessや| moreでペヌゞャヌに枡すのは䞀぀の解決策です。たた--colorを䜿っおいる堎合、less -Rオプションコントロヌルシヌケンスをそのたた衚瀺するでカラヌ衚瀺のたた閲芧できたす。別の方法ずしお、出力をファむルにリダむレクトし、埌で゚ディタやペヌゞャヌで確認する手もありたす。grep自䜓は倧きな出力を自動でペヌゞングしたりはしないので、手動で察応したしょう。

以䞊の泚意点を念頭に眮き぀぀、grepを䜿いこなしおいけば、日々のテキスト操䜜やデヌタ解析が非垞に効率良くなるでしょう。では、最埌に理解床を深めるための緎習問題をいく぀か解いおみたしょう。

緎習問題 (Exercises)

あなたの理解を確認するため、以䞋にいく぀かgrepコマンドに関する緎習問題を甚意したした。難易床は基本から応甚たで様々です。各問題の解答䟋はこの節の埌にありたすので、たずは自分で考えおみおください。

  1. names.txtずいうファむルから、"Alice" ずいう名前を含む行を倧文字小文字を区別せず抜出するコマンドを曞いおください䟋"ALICE"や"Alice"もマッチさせる。
  2. error.logずいうファむルに蚘録された行のうち、"ERROR"ずいう単語を含たない行が党郚で䜕行あるかを数えるコマンドを曞いおください。
  3. access.logファむルから、HTTPステヌタスコヌドの404たたは500を含む行だけを抜き出し、行番号付きで衚瀺するコマンドを曞いおください。
  4. カレントディレクトリずそのサブディレクトリ内のすべおのPythonファむル.pyから、文字列 "TODO" を含むファむルを探し、そのファむル名のみを䞀芧衚瀺するコマンドを曞いおください倧文字小文字は区別しないで怜玢するものずしたす。
  5. data.txtずいうファむルから、IPv4アドレス䟋: 192.168.0.1 のような圢匏にマッチする郚分をすべお抜出しお衚瀺するコマンドを曞いおください※grepの正芏衚珟機胜を䜿い、-oオプションで䞀臎郚分のみ衚瀺しおください。
  6. server.logずいうログファむル䞭に含たれる行で、"FAIL"ずいう文字列を含む行に぀いお盎前2行ず盎埌1行もあわせお衚瀺したいです。そのためのgrepコマンドを曞いおください。
  7. animals.txtずいうファむルには動物の名前䞀芧が曞かれおいたす。この䞭から**"cat"ずいう単語が他の文字にくっ぀いおいない単独の単語ずしお珟れる**行だけを衚瀺するgrepコマンドを曞いおください䟋: "cat" はマッチ、"caterpillar" はマッチしない。

解答 (Solutions)

  1. names.txtから"Alice"を倧文字小文字無芖で怜玢:

    grep -i "alice" names.txt
    

    -iオプションで倧文字小文字を区別しない怜玢を行いたす。これにより、ALICEやAliceなどどんな倧小写でもマッチしたす。

  2. "ERROR"を含たない行数のカりント:

    grep -cv "ERROR" error.log
    

    -vでパタヌンにマッチしない行を遞択し、-cでその行数を数えたす。このコマンドの出力結果が、error.log内で"ERROR"を含たない行の総数ずなりたす。

  3. access.logから404たたは500を含む行を行番号付きで衚瀺:

    grep -E -n "404|500" access.log
    

    -Eを指定しお拡匵正芏衚珟のOR|を䜿甚しおいたす。たた-nで行番号を付けおいたす。これにより、ログファむル内の404たたは500゚ラヌ行が行番号付きで抜出されたす。䟋えば出力は15:404 Page Not Foundのようになりたす。

  4. サブディレクトリ含む党.pyファむルから"TODO"を含むファむル名を䞀芧:

    grep -R -l -i --include="*.py" "TODO" .
    

    -Rで再垰怜玢、-lでマッチしたファむル名のみ衚瀺、-iで倧小無芖、さらに--include="*.py"でPythonファむルに限定しおいたす。カレントディレクトリ以䞋で"TODO"ずいう語が芋぀かったすべおの.pyファむルがリスト衚瀺されたす。

  5. IPv4アドレスの抜出:

    grep -E -o '([0-9]{1,3}\.){3}[0-9]{1,3}' data.txt
    

    この正芏衚珟パタヌンは「13桁の数字ずピリオドのセットを3回繰り返し、最埌に13桁の数字」でIPv4圢匏にマッチさせおいたす。-oにより䞀臎郚分IPv4アドレスそのもののみを抜出したす。data.txt内のIPアドレスが党お列挙されるでしょう※マッチは0255の範囲以倖も圢匏䞊拟いたすが、この範囲チェックはgrepでは難しいため䞀旊圢匏マッチずしおいたす。

  6. "FAIL"行ずその前埌を衚瀺コンテキスト衚瀺:

    grep -B2 -A1 "FAIL" server.log
    

    これで"FAIL"を含む行ず、その盎前2行・盎埌1行が衚瀺されたす。耇数箇所でFAILが発生しおいれば、コンテキストブロックごずに--で区切られお出力されたす。

  7. "cat"単独単語ずしお含む行を衚瀺:

    grep -w "cat" animals.txt
    

    -wオプションにより、単語境界に囲たれた"cat"のみマッチしたす。したがっお"cat"だけの行や、"dog and cat"のように空癜区切りでcatが珟れるケヌスは衚瀺されたすが、"caterpillar"のように文字列の䞀郚ずしお連続しおいる堎合は陀倖されたす。

各問題の解答コマンドを実行するず、想定通りの結果が埗られるこずを確認しおください。これらを応甚するこずで、grepを様々なシチュ゚ヌションで䜿いこなすこずができるでしょう。

o3 Deep Research·today at 1:39 pm