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:
- Core functionality and purpose
- All options and features (except extremely obscure ones), with clear descriptions
- Examples that cover every single option or feature you provided above, mixing basic to advanced, each with expected output or behavior
- Common use cases and best practices
- 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.
æ¿ç¥ããããŸããã
次å以éã®åçã§ã¯ããæç€ºã®ãšããåã·ã§ã«ã³ãã³ãããããã¯ã«ã€ããŠã以äžã®ç¹ãç¶²çŸ
ãã詳现ãªè§£èª¬ãæ¥æ¬èªã§æäŸããããŸãã
- ã³ã¢æ©èœãšç®ç â ã³ãã³ããã¹ã¯ãªããã®åºæ¬çãªåœ¹å²ãšçšé
- äž»èŠãªãªãã·ã§ã³ãšæ©èœ â ïŒæ¥µç«¯ã«ç¹æ®ãªãã®ãé€ãïŒãã¹ãŠã®ãªãã·ã§ã³ãæ©èœã«ã€ããŠãããããã®æç¢ºãªèª¬æ
- å ·äœäŸãšåºå â äžèšã®åãªãã·ã§ã³ãæ©èœãç¶²çŸ ãããããªåºæ¬ããé«åºŠãªäŸã瀺ããæåŸ ãããåºåãåäœã解説
- äžè¬çãªäœ¿çšäŸãšãã¹ããã©ã¯ãã£ã¹ â å®åã§ã®å žåçãªäœ¿ãæ¹ãå¹ççãªå©çšæ³
- 泚æç¹ãèœãšã穎 â å©çšæã«é¥ãããã誀ããèŠéããã¡ãªãã€ã³ããããã³ãããã®åé¿ç
ãŸãã解説å ã§ã¯ä»¥äžã®è¡šèšèŠåã«åŸããŸã:
-
POSIXèŠæ Œå€ã®æ©èœã«ã¯ [Non-POSIX] ãšæèšããŸãã
-
ç¹å®ã®ã·ã§ã«ã«äŸåããæ©èœã«ã¯ã·ã§ã«åïŒäŸ: [bash], [zsh], [ksh], [fish]ïŒãä»èšããŸãã
-
å®è£ ããã©ãããã©ãŒã ã«ããéããããå Žå㯠[GNU], [BSD], [BusyBox], [macOS], [Linux] ãªã©ã®ã¿ã°ã§æç€ºããŸãã
ããã«åãããã¯ã®æåŸã«ã¯ãçè§£ãæ·±ããããé£æåºŠã®ç°ãªã5å以äžã®ç·Žç¿åé¡ãçšæãããã®è§£çãšè§£èª¬ãæ·»ããŸãã
以äžã®æ¹éã§ããã¹ãŠã®èª¬æãå®å šã«èªå·±å®çµããå 容ãšãã远å ã®è³æãåç §ããå¿ èŠããªãããåªããŸããä»åŸãšããããããé¡ãããããŸãã
grep
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ã³ãã³ãã«é¢ããç·Žç¿åé¡ãçšæããŸãããé£æåºŠã¯åºæ¬ããå¿çšãŸã§æ§ã ã§ããååé¡ã®è§£çäŸã¯ãã®ç¯ã®åŸã«ãããŸãã®ã§ããŸãã¯èªåã§èããŠã¿ãŠãã ããã
names.txtãšãããã¡ã€ã«ããã"Alice" ãšããååãå«ãè¡ã倧æåå°æåãåºå¥ããæœåºããã³ãã³ããæžããŠãã ããïŒäŸïŒ"ALICE"ã"Alice"ãããããããïŒãerror.logãšãããã¡ã€ã«ã«èšé²ãããè¡ã®ãã¡ã"ERROR"ãšããåèªãå«ãŸãªãè¡ãå šéšã§äœè¡ããããæ°ããã³ãã³ããæžããŠãã ãããaccess.logãã¡ã€ã«ãããHTTPã¹ããŒã¿ã¹ã³ãŒãã®404ãŸãã¯500ãå«ãè¡ã ããæãåºããè¡çªå·ä»ãã§è¡šç€ºããã³ãã³ããæžããŠãã ããã- ã«ã¬ã³ããã£ã¬ã¯ããªãšãã®ãµããã£ã¬ã¯ããªå
ã®ãã¹ãŠã®Pythonãã¡ã€ã«ïŒ
.pyïŒãããæåå "TODO" ãå«ããã¡ã€ã«ãæ¢ãããã®ãã¡ã€ã«åã®ã¿ãäžèŠ§è¡šç€ºããã³ãã³ããæžããŠãã ããïŒå€§æåå°æåã¯åºå¥ããªãã§æ€çŽ¢ãããã®ãšããŸãïŒã data.txtãšãããã¡ã€ã«ãããIPv4ã¢ãã¬ã¹ïŒäŸ: 192.168.0.1 ã®ãããªåœ¢åŒïŒã«ãããããéšåããã¹ãŠæœåºããŠè¡šç€ºããã³ãã³ããæžããŠãã ããïŒâ»grepã®æ£èŠè¡šçŸæ©èœã䜿ãã-oãªãã·ã§ã³ã§äžèŽéšåã®ã¿è¡šç€ºããŠãã ããïŒãserver.logãšãããã°ãã¡ã€ã«äžã«å«ãŸããè¡ã§ã"FAIL"ãšããæååãå«ãè¡ã«ã€ããŠçŽå2è¡ãšçŽåŸ1è¡ãããããŠè¡šç€ºãããã§ãããã®ããã®grepã³ãã³ããæžããŠãã ãããanimals.txtãšãããã¡ã€ã«ã«ã¯åç©ã®ååäžèŠ§ãæžãããŠããŸãããã®äžãã**"cat"ãšããåèªãä»ã®æåã«ãã£ã€ããŠããªãåç¬ã®åèªãšããŠçŸãã**è¡ã ãã衚瀺ããgrepã³ãã³ããæžããŠãã ããïŒäŸ: "cat" ã¯ãããã"caterpillar" ã¯ãããããªãïŒã
è§£ç (Solutions)
-
names.txtãã"Alice"ã倧æåå°æåç¡èŠã§æ€çŽ¢:
grep -i "alice" names.txt-iãªãã·ã§ã³ã§å€§æåå°æåãåºå¥ããªãæ€çŽ¢ãè¡ããŸããããã«ãããALICEãAliceãªã©ã©ããªå€§å°åã§ããããããŸãã -
"ERROR"ãå«ãŸãªãè¡æ°ã®ã«ãŠã³ã:
grep -cv "ERROR" error.log-vã§ãã¿ãŒã³ã«ãããããªãè¡ãéžæãã-cã§ãã®è¡æ°ãæ°ããŸãããã®ã³ãã³ãã®åºåçµæããerror.logå ã§"ERROR"ãå«ãŸãªãè¡ã®ç·æ°ãšãªããŸãã -
access.logãã404ãŸãã¯500ãå«ãè¡ãè¡çªå·ä»ãã§è¡šç€º:
grep -E -n "404|500" access.log-Eãæå®ããŠæ¡åŒµæ£èŠè¡šçŸã®ORïŒ|ïŒã䜿çšããŠããŸãããŸã-nã§è¡çªå·ãä»ããŠããŸããããã«ããããã°ãã¡ã€ã«å ã®404ãŸãã¯500ãšã©ãŒè¡ãè¡çªå·ä»ãã§æœåºãããŸããäŸãã°åºåã¯15:404 Page Not Foundã®ããã«ãªããŸãã -
ãµããã£ã¬ã¯ããªå«ãå š
.pyãã¡ã€ã«ãã"TODO"ãå«ããã¡ã€ã«åãäžèЧ:grep -R -l -i --include="*.py" "TODO" .-Rã§ååž°æ€çŽ¢ã-lã§ããããããã¡ã€ã«åã®ã¿è¡šç€ºã-iã§å€§å°ç¡èŠãããã«--include="*.py"ã§Pythonãã¡ã€ã«ã«éå®ããŠããŸããã«ã¬ã³ããã£ã¬ã¯ããªä»¥äžã§"TODO"ãšããèªãèŠã€ãã£ããã¹ãŠã®.pyãã¡ã€ã«ããªã¹ã衚瀺ãããŸãã -
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ã§ã¯é£ããããäžæŠåœ¢åŒããããšããŠããŸãïŒã -
"FAIL"è¡ãšãã®ååŸã衚瀺ïŒã³ã³ããã¹ã衚瀺ïŒ:
grep -B2 -A1 "FAIL" server.logããã§"FAIL"ãå«ãè¡ãšããã®çŽå2è¡ã»çŽåŸ1è¡ã衚瀺ãããŸããè€æ°ç®æã§FAILãçºçããŠããã°ãã³ã³ããã¹ããããã¯ããšã«
--ã§åºåãããŠåºåãããŸãã -
"cat"åç¬åèªãšããŠå«ãè¡ã衚瀺:
grep -w "cat" animals.txt-wãªãã·ã§ã³ã«ãããåèªå¢çã«å²ãŸãã"cat"ã®ã¿ãããããŸãããããã£ãŠ"cat"ã ãã®è¡ãã"dog and cat"ã®ããã«ç©ºçœåºåãã§catãçŸããã±ãŒã¹ã¯è¡šç€ºãããŸããã"caterpillar"ã®ããã«æååã®äžéšãšããŠé£ç¶ããŠããå Žåã¯é€å€ãããŸãã
ååé¡ã®è§£çã³ãã³ããå®è¡ãããšãæ³å®éãã®çµæãåŸãããããšã確èªããŠãã ãããããããå¿çšããããšã§ãgrepãæ§ã
ãªã·ãã¥ãšãŒã·ã§ã³ã§äœ¿ãããªãããšãã§ããã§ãããã