๐ŸŒ *[ฤŒeลกtina](README-cs.md) โˆ™ [ฮ•ฮปฮปฮทฮฝฮนฮบฮฌ](README-el.md) โˆ™ [English](README.md) โˆ™ [Espaรฑol](README-es.md) โˆ™ [Franรงais](README-fr.md) โˆ™ [Italiano](README-it.md) โˆ™ [ๆ—ฅๆœฌ่ชž](README-ja.md) โˆ™ [ํ•œ๊ตญ์–ด](README-ko.md) โˆ™ [Portuguรชs](README-pt.md) โˆ™ [ะ ัƒััะบะธะน](README-ru.md) โˆ™ [Slovenลกฤina](README-sl.md) โˆ™ [ะฃะบั€ะฐั—ะฝััŒะบะฐ](README-uk.md) โˆ™ [็ฎ€ไฝ“ไธญๆ–‡](README-zh.md) โˆ™ [็น้ซ”ไธญๆ–‡](README-zh-Hant.md)* # The Art of Command Line [![Ask a Question](https://img.shields.io/badge/%3f-Ask%20a%20Question-ff69b4.svg)](https://airtable.com/shrzMhx00YiIVAWJg) [![Join the chat at https://gitter.im/jlevy/the-art-of-command-line](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jlevy/the-art-of-command-line?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - [Meta](#meta) - [Basics](#basics) - [Everyday use](#everyday-use) - [Processing files and data](#processing-files-and-data) - [System debugging](#system-debugging) - [One-liners](#one-liners) - [Obscure but useful](#obscure-but-useful) - [OS X only](#os-x-only) - [Windows only](#windows-only) - [More resources](#more-resources) - [Disclaimer](#disclaimer) ![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png) ์ปค๋งจ๋“œ ๋ผ์ธ์„ ๋Šฅ์ˆ™ํ•˜๊ฒŒ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์€ ๋„์™ธ์‹œ๋˜๊ฑฐ๋‚˜ ์‹ ๋น„์Šค๋Ÿฝ๊ฒŒ ์—ฌ๊ฒจ์ง‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ปค๋งจ๋“œ ๋ผ์ธ์€ ๋ช…๋ฐฑํ•˜๊ณ ๋„ ๋ฏธ๋ฌ˜ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ํ•˜๋Š” ์ž‘์—…์˜ ์œ ์—ฐ์„ฑ๊ณผ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ๋ฆฌ๋ˆ…์Šค์—์„œ ์ž‘์—…์„ ํ•˜๋ฉด์„œ ์ฐพ์€ ๋…ธํŠธ์™€ ํŒ๋“ค์˜ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€๋Š” ๊ธฐ์ดˆ์ ์ด๊ณ , ๋ช‡ ๊ฐ€์ง€๋Š” ์ƒ๋‹นํžˆ ๊ตฌ์ฒด์ ์ด๋ฉฐ, ์„ธ๋ จ๋˜๊ณ , ์ž˜ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ๊ทธ๋ฆฌ ๊ธธ์ง€ ์•Š์ง€๋งŒ, ์—ฌ๊ธฐ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ , ๊ธฐ์–ตํ•ด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค๋ฉด, ๋งŽ์€ ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” [๋งŽ์€ ์ž‘๊ฐ€์™€ ๋ฒˆ์—ญ๊ฐ€](AUTHORS.md)๊ฐ€ ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์ค‘ ์ผ๋ถ€ ๊ฒƒ์€ [์›๋ž˜](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands) [Quora์—](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix) [์˜ฌ๋ผ์˜จ](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know) ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฑฐ๊ธฐ์— ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ธฐ๋ณด๋‹ค, Github๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ€์น˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—” ๋” ์žฌ๋Šฅ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์†์‰ฝ๊ฒŒ ๊ฐœ์„ ์•ˆ์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด์ฃ . ๋งจ๋“œ ๋ž€์ด์— ๊ด€ํ•œ ์งˆ๋ฌธ์ด ์žˆ์œผ๋ฉด [**์งˆ๋ฌธํ•ด ์ฃผ์„ธ์š”**.](https://airtable.com/shrzMhx00YiIVAWJg) ์˜ค๋ฅ˜๊ฐ€ ์žˆ๊ฑฐ๋‚˜, ๋” ๋‚˜์•„์งˆ ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์ด ๋ณด์ธ๋‹ค๋ฉด, [**๊ธฐ์—ฌ ํ•ด ์ฃผ์„ธ์š”**!](/CONTRIBUTING.md) ## Meta ๋ฒ”์œ„: - ์ด ๊ฐ€์ด๋“œ๋Š” ์ดˆ๋ณด์ž์™€ ๊ฒฝํ—˜์ž ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ๋ฒ”์œ„(์ „๋ถ€ ๋‹ค ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!), ๊ตฌ์ฒด์„ฑ(๋Œ€๋ถ€๋ถ„์˜ ์ผ๋ฐ˜์ ์ธ ์ผ€์ด์Šค์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ์ œ), ๊ทธ๋ฆฌ๊ณ  ๊ฐ„๊ฒฐํ•จ(์‰ฝ๊ฒŒ ๋งˆ์ฃผ์น˜์ง€ ์•Š๋Š”, ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ , ์ง€์—ฝ์ ์ธ ๊ฒƒ์„ ํ”ผํ•จ)์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒ์€ ํŠน์ • ์ƒํ™ฉ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•˜๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ๋Œ€์•ˆ๋“ค ์‚ฌ์ด์—์„œ์˜ ์‹œ๊ฐ„์„ ํ™•์—ฐํ•˜๊ฒŒ ์ ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. - ์ด ๋ฌธ์„œ๋Š” ๋ฆฌ๋ˆ…์Šค๋ฅผ ์œ„ํ•œ๊ฒƒ์ž…๋‹ˆ๋‹ค. "[OS X only](#os-x-only)", "[Windows only](#windows-only)" ์„น์…˜์„ ์ œ์™ธํ•˜๊ณ  ๋ง์ด์ฃ . ๊ทธ ๋ฐ–์˜ ๋Œ€๋ถ€๋ถ„์€ ์œ ๋‹‰์Šค, OS X(์‹ฌ์ง€์–ด Cygwin)์—์„œ๋„ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ Bash์— ์ดˆ์ ์ด ๋งž์ถ”์–ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ํŒ์€ ๋‹ค๋ฅธ ์‰˜์ด๋‚˜, general Bash ์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. - ์ด ๋ฌธ์„œ๋Š” "ํ‘œ์ค€" ์œ ๋‹‰์Šค ์ปค๋งจ๋“œ์™€ ํŠน์ • ํŒจํ‚ค์ง€ ์„ค์น˜๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ ๋‘˜ ๋‹ค ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‹ค๋ฃจ๋Š” ํ‘œ์ค€ ์ปค๋งจ๋“œ์™€ ํŠน์ • ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๊ฒƒ์€ ํฌํ•จ๋  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋…ธํŠธ: - ์ด ๋ฌธ์„œ๋ฅผ ํ•œ ํŒŒ์ผ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ์ฝ˜ํ…์ธ ๋“ค์€ ์•”์‹œ์ ์ธ ๋ ˆํผ๋Ÿฐ์Šค ํ˜•ํƒœ๋กœ ํฌํ•จ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐœ๋…์ด๋‚˜ ๋ช…๋ น์–ด์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋œ ํ›„์—, ๊ตฌ๊ธ€์—์„œ ๊ทธ์— ๋Œ€ํ•œ ์ข€ ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์„ ๋งŒํผ ๋‹น์‹ ์€ ๋˜‘๋˜‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. `apt-get`, `yum`, `dnf`, `pacman`, `pip`, `brew` (ํ˜น์€ ์ ์ ˆํ•œ ๋‹ค๋ฅธ ๊ฒƒ)์„ ์ด์šฉํ•ด ์ƒˆ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•˜์„ธ์š”. - [Explainshell](http://explainshell.com/)์„ ์ด์šฉํ•ด์„œ ๊ฐ๊ฐ์˜ ์ปค๋งจ๋“œ, ์˜ต์…˜, ํŒŒ์ดํ”„๋‚˜ ๊ทธ ์™ธ ๋“ฑ๋“ฑ์ด ์–ด๋–ค ๊ฒƒ์ธ์ง€ ์•Œ์•„๋ณด์‹ญ์‹œ์˜ค. ## Basics - ๊ธฐ๋ณธ Bash๋ฅผ ๋ฐฐ์šฐ์„ธ์š”. ๋งํ•˜์ž๋ฉด, ์ตœ์†Œํ•œ `man bash`๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ „๋ถ€๋ฅผ ํ›‘์–ด๋ณด์„ธ์š”. ๋งค๋‰ด์–ผ์˜ ๋‚ด์šฉ์€ ๋”ฐ๋ผ๊ฐ€๊ธฐ ์‰ฌ์šฐ๋ฉฐ ๊ทธ๋ฆฌ ๊ธธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‰˜๋“ค ๋˜ํ•œ ์ข‹์Šต๋‹ˆ๋‹ค๋งŒ, Bash๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ์–ธ์ œ๋‚˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(zsh, fish, ๊ทธ ์™ธ์˜ ์‰˜*๋งŒ*์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์€, ๋…ธํŠธ๋ถ์—์„œ๋Š” ์ข‹๊ฒ ์ง€๋งŒ, ๋งŽ์€ ๊ฒฝ์šฐ ์ œํ•œ์ด ์ƒ๊ธธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋“ฑ์˜ ์ผ์—์„œ ๋ง์ด์ฃ ). - ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์—๋””ํ„ฐ๋ฅผ ์ตœ์†Œํ•œ ํ•˜๋‚˜ ์ •๋„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋ฐฐ์šฐ์„ธ์š”. Vim(`Vi`)๊ฐ€ ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ ์˜จ๊ฐ– ์ž‘์—…์„ ํ•˜๋Š”๋ฐ ๋‹ค๋ฅธ ์‹ค์งˆ์ ์ธ ๊ฒฝ์Ÿ์ž๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด์ฃ (Emacs, ๋Œ€ํ˜• IDE ๋˜๋Š” ๋ชจ๋˜ ํž™์Šคํ„ฐ์Šค๋Ÿฌ์šด ์—๋””ํ„ฐ๋ฅผ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์— ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด๋„ ๋ง์ด์ฃ ). - `man`์„ ์ด์šฉํ•ด์„œ ๋ฌธ์„œ๋ฅผ ์ฝ๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ์„ธ์š”(ํ˜ธ๊ธฐ์‹ฌ ๋งŽ์€ ์‚ฌ๋žŒ์„ ์œ„ํ•ด์„œ ํ•˜๋Š” ์–˜๊ธฐ์ž…๋‹ˆ๋‹ค๋งŒ, `man man`์€ ์„น์…˜ ๋ฒˆํ˜ธ๋“ค์˜ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 1์€ "regular" ์ปค๋งจ๋“œ, 5๋Š” files/conventions, ๊ทธ๋ฆฌ๊ณ  8์€ administration์ด์ฃ ). `apropos`๋ฅผ ์ด์šฉํ•ด์„œ man ํŽ˜์ด์ง€๋ฅผ ์ฐพ์œผ์„ธ์š”. ๋ช‡๋ช‡ ์ปค๋งจ๋“œ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ปค๋งจ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์„ธ์š”. ํ•˜์ง€๋งŒ Bash ๋นŒํŠธ์ธ ํ•จ์ˆ˜๋“ค์€ `help`์™€ `help -d`๋ฅผ ์ด์šฉํ•ด์„œ ๋„์›€๋ง์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - `>`์™€ `<`, `|`๋ฅผ ์ด์šฉํ•œ ํŒŒ์ดํ”„๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์˜ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ๋ฐฐ์šฐ์„ธ์š”. `>`๋Š” ์ถœ๋ ฅ ํŒŒ์ผ์„ ๋ฎ์–ด ์”Œ์šฐ๊ณ , `>>`๋Š” ๋ง๋ถ™์ด๋Š” ๊ฑธ ์•Œ์•„๋‘์„ธ์š”. stdout(์—ญ์ฃผ: ํ‘œ์ค€ ์ถœ๋ ฅ)๊ณผ stderr(์—ญ์ฃผ: ํ‘œ์ค€ ์—๋Ÿฌ ์ถœ๋ ฅ)์— ๋Œ€ํ•ด์„œ ๋ฐฐ์šฐ์„ธ์š”. - `*`(๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ `?`๊ณผ `[`...`]`)์„ ์ด์šฉํ•˜๋Š” ํŒŒ์ผ ๊ธ€๋กญ(glob) ํ™•์žฅ์„ ๋ฐฐ์šฐ์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ์Œ๋”ฐ์˜ดํ‘œ`"`์™€ ํ™‘๋”ฐ์˜ดํ‘œ`'`์˜ ์ฐจ์ด๋ฅผ ๋ฐฐ์šฐ์„ธ์š”. (๋ณ€์ˆ˜ ํ™•์žฅ์— ๋Œ€ํ•ด์„œ ๋” ๋ณด๋ ค๋ฉด ์•„๋ž˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”) - Bash ์ž‘์—… ๊ด€๋ฆฌ์— ์ต์ˆ™ํ•ด์ง€์„ธ์š”. `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill` ๋“ฑ๋“ฑ. - `ssh`๋ฅผ ๋ฐฐ์šฐ๊ณ , `ssh-agent`, `ssh-add`๋ฅผ ํ†ตํ•ด์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†๋Š” ์ธ์ฆ ๋ฐฉ์‹์˜ ๊ธฐ๋ณธ์„ ๋ฐฐ์šฐ์„ธ์š”. - ๊ธฐ๋ณธ ํŒŒ์ผ ๊ด€๋ฆฌ: `ls`์™€ `ls -l`(ํŠน๋ณ„ํžˆ, `ls -l`์—์„œ ๊ฐ๊ฐ์˜ ์—ด์ด ๋ฌด์Šจ ์˜๋ฏธ์ธ์ง€ ๋ฐฐ์šฐ์„ธ์š”), `less`, `head`, `tail` ๊ทธ๋ฆฌ๊ณ  `tail -f`(๋˜๋Š” ๋” ์ข‹์€ `less +F`), `ln`๊ณผ `ln -s`(ํ•˜๋“œ ๋งํฌ์™€ ์†Œํ”„ํŠธ ๋งํฌ์˜ ์ฐจ์ด์™€ ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์„ ๋ฐฐ์šฐ์„ธ์š”), `chown`, `chmod`, `du`( ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์˜ ๋น ๋ฅธ ์š”์•ฝ์„ ๋ณด๋ ค๋ฉด `du -hs *`). ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” `df`, `mount`, `fdisk`, `mkfs`, `lsblk`. inode๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ฐฐ์šฐ์„ธ์š”.(`ls -i` ๋˜๋Š” `df -i`) - ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ ๊ด€๋ฆฌ: `ip` ๋˜๋Š” `ifconfig`, `dig`. - `git` ๊ฐ™์€ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ๋ฐฐ์šฐ๊ณ  ์‚ฌ์šฉํ•˜์„ธ์š”. - ์ •๊ทœ ํ‘œํ˜„์‹(regular expression)์„ ์ž˜ ์•Œ์•„๋‘์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  `grep`/`egrep`์˜ ๋‹ค์–‘ํ•œ ํ”Œ๋ž˜๊ทธ๋„ ์•Œ์•„๋‘์„ธ์š”. `-i`, `-o`, `-v`,`-A`, `-B`์™€ `-C` ์˜ต์…˜์€ ์•Œ์•„๋‘˜ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. - `apt-get`, `yum`, `dnf` ๋˜๋Š” `pacman`(๋ฐฐํฌํŒ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค)์„ ์ด์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์ฐพ๊ณ  ์„ค์น˜ํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  `pip`๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์„œ, ํŒŒ์ด์„  ๊ธฐ๋ฐ˜์˜ ์ปค๋งจ๋“œ ๋ผ์ธ ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์„ธ์š”(๋ฐ‘์— ์„ค๋ช…๋œ ๊ฒƒ ์ค‘ ๋ช‡ ๊ฐ€์ง€๋Š” `pip`๋ฅผ ์ด์šฉํ•ด ์„ค์น˜ํ•˜๋Š” ๊ฒŒ ์ œ์ผ ์‰ฝ์Šต๋‹ˆ๋‹ค. ## Everyday use - Bash ์—์„œ **Tab**์„ ์“ฐ๋ฉด argument๋ฅผ ์™„์„ฑํ•˜๊ณ , **ctrl-r**์„ ์“ฐ๋ฉด ์ปค๋งจ๋“œ ํžˆ์Šคํ† ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค(๋ˆ„๋ฅธ ๋‹ค์Œ, ๊ฒ€์ƒ‰ํ•  ๊ฒƒ์„ ์ž…๋ ฅํ•˜๊ณ , **ctrl-r**๋ฅผ ๊ณ„์† ๋ˆŒ๋Ÿฌ ์ข€ ๋” ๋งž๋Š” ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **Enter**๋ฅผ ๋ˆŒ๋Ÿฌ ์ฐพ์€ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์˜ค๋ฅธ์ชฝ ํ™”์‚ดํ‘œ ํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ ๊ฒฐ๊ณผ๋ฅผ ํ˜„์žฌ ๋ผ์ธ์— ๋ณต์‚ฌํ•ด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). - Bash์—์„œ **ctrl-w**๋Š” ๋งˆ์ง€๋ง‰ ๋‹จ์–ด๋ฅผ ์ง€์›๋‹ˆ๋‹ค. **ctrl-u**๋Š” ๋ผ์ธ์˜ ์ฒ˜์Œ๊นŒ์ง€ ์ „๋ถ€๋‹ค ์ง€์›๋‹ˆ๋‹ค. **alt-b**์™€ **alt-f**๋ฅผ ์ด์šฉํ•ด์„œ ๋‹จ์–ด ๋‹จ์œ„๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **ctrl-a**๋กœ ๋ผ์ธ์˜ ์‹œ์ž‘์ ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ณ  **ctrl-e**๋กœ ๋ผ์ธ์˜ ๋์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **ctrl-k**๋Š” ์ปค์„œ ์œ„์น˜๋ถ€ํ„ฐ ๋ผ์ธ์˜ ๋๊นŒ์ง€ ์ง€์›๋‹ˆ๋‹ค. **ctrl-l**์€ ํ™”๋ฉด์„ ๊นจ๋—ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. `man readline`์„ ์ด์šฉํ•ด์„œ Bash์˜ ๊ธฐ๋ณธ ํ‚ค ์กฐํ•ฉ์„ ์‚ดํŽด๋ณด์„ธ์š”. ๋งŽ์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด **alt-.**๊ฐ™์€ ๊ฒฝ์šฐ, ์ด๊ฑด argument๋ฅผ ๋Œ์•„๊ฐ€๋ฉด์„œ ๋‚˜ํƒ€๋‚ด๊ณ  **alt-***๋Š” ๊ธ€๋กญ์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. - vi ์Šคํƒ€์ผ์˜ ํ‚ค ์กฐํ•ฉ์„ ์‚ฌ๋ž‘ํ•œ๋‹ค๋ฉด, `set -o vi`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(`set -o emacs`๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). - ๊ธด ๋ช…๋ น์„ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ์—๋””ํ„ฐ๋ฅผ ์„ค์ •ํ•œ ๋‹ค์Œ(์˜ˆ๋ฅผ ๋“ค๋ฉด, `export EDITOR=vim`) **ctrl-x** **ctrl-e**๋ฅผ ๋ˆŒ๋Ÿฌ ํ˜„์žฌ ๋ช…๋ น์„ ์—๋””ํ„ฐ์—์„œ ์—ด์–ด ์—ฌ๋Ÿฌ์ค„ ํŽธ์ง‘์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. vi ์Šคํƒ€์ผ์—์„œ๋Š” **escape-v**๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. - ์ตœ๊ทผ ์‚ฌ์šฉํ•œ ์ปค๋งจ๋“œ๋ฅผ ๋ณด๋ ค๋ฉด `history`๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”. ๊ทธ ํ›„ `!n`์œผ๋กœ(์—ฌ๊ธฐ์„œ `n`์€ ์ปค๋งจ๋“œ ๋ฒˆํ˜ธ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค) ๋‹ค์‹œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `!$`(๋งˆ์ง€๋ง‰ argument), `!!`(๋งˆ์ง€๋ง‰ ์ปค๋งจ๋“œ)์™€ ๊ฐ™์€ ์•ฝ์–ด๋“ค์ด ๋งค์šฐ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋น„๋ก ์ด๋Ÿฐ ๊ฒƒ๋“ค์ด **ctrl-r**์ด๋‚˜ **alt-.**๋ช…๋ น์–ด๋กœ ์ž์ฃผ ๋Œ€์ฒด๋˜๊ธฐ ์‰ฝ์ง€๋งŒ์š”. - `cd`๋กœ ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์ƒ๋Œ€์ ์œผ๋กœ ํŒŒ์ผ์„ ์ ‘๊ทผํ•˜๋ ค๋ฉด `~` ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: `~/.bashrc`). `sh` ์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” `$HOME`๋กœ ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. - ์ด์ „์— ์ž‘์—…ํ•˜๋˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋Œ์•„๊ฐ€๋ ค๋ฉด `cd -`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - ์ปค๋งจ๋“œ๋ฅผ ํƒ€์ดํ•‘ํ•˜๋˜ ๋„์ค‘์— ๋งˆ์Œ์ด ๋ฐ”๋€Œ์—ˆ๋‹ค๋ฉด, **alt-#**์„ ์ณ์„œ ์‹œ์ž‘์ ์— `#`์„ ์‚ฝ์ž…ํ•˜๊ณ , ์—”ํ„ฐ๋ฅผ ์ณ์„œ ์ฝ”๋ฉ˜ํŠธ๋กœ ์—ฌ๊ฒจ์ง€๊ฒŒ ํ•˜์„ธ์š”(๋˜๋Š” **ctrl-a**, **#**, **enter**). ๋‚˜์ค‘์— ์ปค๋งจ๋“œ ํžˆ์Šคํ† ๋ฆฌ์—์„œ ์ฐพ์•„์„œ ํƒ€์ดํ•‘ ์ค‘์ด์—ˆ๋˜ ์ปค๋งจ๋“œ๋กœ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - `xargs`(ํ˜น์€ `parallel`)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋งค์šฐ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ธ๋‹น ๋ช‡ ๊ฐœ์˜ ์•„์ดํ…œ์ด ์‹คํ–‰๋˜๊ฒŒ ํ•  ๊ฒƒ์ธ์ง€(`-L`) ๊ทธ๊ฑธ ๋ณ‘๋ ฌ๋กœ ํ•  ๊ฒƒ์ธ์ง€(`-P`)๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ๊ธฐ์–ตํ•˜์„ธ์š”. ์ œ๋Œ€๋กœ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด `xargs echo`๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•ด๋ณด์„ธ์š”. ๋˜ `-I{}`๋„ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ: ```bash find . -name '*.py' | xargs grep some_function cat hosts | xargs -I{} ssh root@{} hostname ``` - `pstree -p`๋Š” ํ”„๋กœ์„ธ์Šค ํŠธ๋ฆฌ๋ฅผ ํ‘œ์‹œํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. - `pgrep`๊ณผ `pkill`์„ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด์„ธ์š”(`-f`๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค). - ํ”„๋กœ์„ธ์Šค์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์‹œ๊ทธ๋„์„ ์•Œ์•„๋‘์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ”„๋กœ์„ธ์Šค๋ฅผ ์ผ์‹œ ์ค‘์ง€ ํ•  ๋•Œ๋Š” `kill -STOP [pid]`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋ชฉ๋ก์€ `man 7 signal`์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์˜์›ํžˆ ๋Œ์•„๊ฐ€๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด, `nohup`์ด๋‚˜ `disown`์„ ์‚ฌ์šฉํ•˜์„ธ์š”. - ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฆฌ์Šค๋‹(์—ญ์ฃผ: ํŠน์ • ํฌํŠธ๋กœ ๋“ค์–ด์˜ค๋Š” ํŒจํ‚ท ๋ฆฌ์Šค๋‹)์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๋ ค๋ฉด `netstat -lntp`๋‚˜ `ss -plat`์„ ์‚ฌ์šฉํ•ด์„œ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(TCP ์ผ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. UDP์˜ ๊ฒฝ์šฐ `-u`์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”). - `lsof`๋ฅผ ์ด์šฉํ•ด์„œ ์—ด๋ ค์žˆ๋Š” ์†Œ์ผ“๊ณผ ํŒŒ์ผ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - `uptime`์ด๋‚˜ `w`๋ฅผ ์ด์šฉํ•ด์„œ ์‹œ์Šคํ…œ์ด ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ์‹คํ–‰ ์ค‘์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ปค๋งจ๋“œ์— ๋Œ€ํ•ด์„œ `alias`๋ฅผ ์ด์šฉํ•ด์„œ ์ˆ์ปท์„ ๋งŒ๋“œ์„ธ์š”. ์˜ˆ๋ฅผ๋“ค์–ด, `alias ll='ls -latr'`์€ ์ƒˆ ๋‹จ์ถ• ๋ช…๋ น `ll`์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. - ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์ถ•, ์„ค์ •, ํ•จ์ˆ˜๋Š” `~/.bashrc`์— ์ €์žฅํ•˜๊ณ , [๊ทธ๊ฒƒ์„ ์ฐธ์กฐํ•˜๋Š” ๋กœ๊ทธ์ธ ์…ธ์„ ๊ณ ์ณ๋ณด์„ธ์š”](http://superuser.com/a/183980/7106). ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„ค์ •์„ ๋ชจ๋“  ์…ธ ์„ธ์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •์ด๋‚˜ ๋กœ๊ทธ์ธํ•  ๋•Œ ์‹คํ–‰ํ•ด์•ผ ํ•  ๋ช…๋ น์€ `~/.bash_profile`์— ๋„ฃ์œผ์„ธ์š”. ๊ทธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์˜ ๋กœ๊ทธ์ธ์˜ ์…ธ๊ณผ `cron` ์žก์˜ ์…ธ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ค์ •์„ ๋ถ„๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. - Git์œผ๋กœ ์—ฌ๋Ÿฌ ์ปดํ“จํ„ฐ์—์„œ ๊ฐ™์€ ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์„ธ์š”(์˜ˆ `.bashrc`, `.bash_profile`). - ๊ณต๋ฐฑ์ด ๋“ค์–ด๊ฐ„ ๋ณ€์ˆ˜๋ช…์ด๋‚˜ ํŒŒ์ผ๋ช…์€ ์ฃผ์˜ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Bash ๋ณ€์ˆ˜๋ฅผ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ์„ธ์š”(์˜ˆ: `"$FOO"`). ํŒŒ์ผ ์ด๋ฆ„์˜ ๊ฒฝ๊ณ„์— ๊ณต๋ฐฑ ๋ฌธ์ž๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋ฉด `-0`์ด๋‚˜ `-print0` ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค๋ฉด, `locate -0 pattern | xargs -0 ls -al`, `find / -print0 -type d | xargs -0 ls -al`. for ๋ฌธ์—์„œ ๊ณต๋ฐฑ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ ์ด๋ฆ„์„ ๋ฐ˜๋ณตํ•˜๋ ค๋ฉด, `IFS=$'\n'`๋กœ IFS๋ฅผ ๊ฐœํ–‰ ๋ฌธ์ž๋งŒ์œผ๋กœ ์„ค์ •ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. - Bash ์Šคํฌ๋ฆฝํŠธ์—์„œ `set -x`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋””๋ฒ„๊น…์šฉ ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ์˜ต์…˜ `set -v`๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์žฅ๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์™€ ์ฃผ์„์„ ํฌํ•จํ•œ ๋กœ์šฐ ์ž…๋ ฅ์„ ๋กœ๊น…ํ•ฉ๋‹ˆ๋‹ค). ์ŠคํŠธ๋ฆญํŠธ ๋ชจ๋“œ(strict mode)๊ฐ€ ๊ฐ€๋Šฅํ•  ๋•Œ๋ฉด ์‚ฌ์šฉํ•˜์„ธ์š”. `set -e`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์„ ๋•Œ ์ค‘๋‹จ์‹œํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. `set -u`์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ค์ •๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์•„ ์ค๋‹ˆ๋‹ค. `set -o pipefail`์„ ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ์— ๋Œ€ํ•ด์„œ ๊ฐ•๊ฒฝํ•œ ๊ธฐ์ค€์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค(์ด ์ฃผ์ œ๊ฐ€ ์กฐ๊ธˆ ๋ฏธ๋ฌ˜ํ•˜์ง€๋งŒ ๋ง์ด์ฃ ). ๋” ๋ณต์žกํ•œ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฝ์šฐ EXIT๋‚˜ ERR์— `trap`๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์Šต๊ด€์€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ์ผ๋ฐ˜์ ์ธ ์—๋Ÿฌ๋ฅผ ์ฐพ๊ณ  ์ค‘๋‹จํ•˜๊ณ , ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค. ```bash set -euo pipefail trap "echo 'error: Script failed: see failed command above'" ERR ``` - Bash ์Šคํฌ๋ฆฝํŠธ์—์„œ (๊ด„ํ˜ธ๋กœ ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์ž‘์„ฑ๋œ) ์„œ๋ธŒ ์…ธ์€ ์ปค๋งจ๋“œ๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์˜ˆ๋กœ, ์ž„์‹œ๋กœ ๋‹ค๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•˜์—ฌ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ```bash # do something in current dir (cd /some/other/dir && other-command) # continue in original dir ``` - Bash ์—๋Š” ๋‹ค์–‘ํ•œ ๋ณ€์ˆ˜ ํ™•์žฅ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์„ธ์š”. ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด `${name:?error message}`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด Bash ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•˜๋‚˜์˜ argument๋ฅผ ์š”๊ตฌํ•œ๋‹ค๋ฉด, `input_file=${1:?usage: $0 input_file}`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋ณ€์ˆ˜๊ฐ€ ๋น„์–ด์žˆ์„ ๋•Œ๋ฅผ ๋Œ€๋น„ํ•ด ๊ธฐ๋ณธ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์„ธ์š”. `${name:-default}` ์ด์ „ ์˜ˆ์ œ์— ์„ ํƒ์ ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด `output_file=${2:-logfile}`๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $2๊ฐ€ ์ƒ๋žต๋˜์–ด ๋น„์–ด์žˆ๋‹ค๋ฉด, `output_file`์€ `logfile`๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์‚ฐ์ˆ  ํ™•์žฅ์€ `i=$(( (i + 1) % 5 ))` ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์—ด์€ `{1...10}`์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ํŠธ๋ฆฌ๋ฐ(trimmin)์€ `${var%suffix}`์ด๋‚˜ `${var#prefix}`์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด `var=foo.pdf`๋ผ๋ฉด, `echo ${var$.pdf}.txt`๋Š” `foo.txt`๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. - `{`...`}`๋ฅผ ์‚ฌ์šฉํ•œ ๊ด„ํ˜ธ ํ™•์žฅ์€ ๋น„์Šทํ•œ ํ…์ŠคํŠธ์˜ ์žฌ์ž…๋ ฅ์„ ์ค„์ด๊ณ , ์•„์ดํ…œ์˜ ์กฐํ•ฉ์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `mv foo.{txt,pdf} some-dir` (์–‘์ชฝ ํŒŒ์ผ๋“ค์„ ์˜ฎ๊น€), `cp somefile{,.bak}` (`cp somefile somefile.bak`๋กœ ํ™•์žฅ), `mkdir -p test-{a,b,c}/subtest-{1,2,3}` (๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์œผ๋กœ ํ™•์žฅํ•ด ๋””๋ ‰ํ„ฐ๋ฆฌ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑ) ๊ฐ™์€ ์˜ˆ์ œ๋“ค์€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. - ์ปค๋งจ๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ ์ถœ๋ ฅ๋ฌผ์€ `<(some command)`์ฒ˜๋Ÿผ ์ด์šฉํ•ด์„œ ํŒŒ์ผ์ฒ˜๋Ÿผ ๋‹ค๋ค„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ์ปฌ์˜ `/etc/hosts`๋ฅผ ๋ฆฌ๋ชจํŠธ์˜ ๊ฒƒ๊ณผ ๋น„๊ตํ•˜๋ ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ```bash diff /etc/hosts <(ssh somehost cat /etc/hosts) ``` - ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ ์„ ๋•Œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋Œ€๊ด„ํ˜ธ ์•ˆ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ซ๋Š” ๊ด„ํ˜ธ๊ฐ€ ์—†์œผ๋ฉด ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ตฌ๋ฌธ ์—๋Ÿฌ๊ฐ€ ๋˜์–ด ์‹คํ–‰์ด ๋ฐฉ์ง€๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์›น์œผ๋กœ๋ถ€ํ„ฐ ๋‹ค์šด๋กœ๋“œํ•  ์˜ˆ์ •์ด๋ผ ํ•  ๋•Œ ๋„์ค‘๊นŒ์ง€๋งŒ ๋‹ค์šด๋กœ๋“œ๋œ ํŒŒ์ผ์ด ์‹คํ–‰ ๋˜๋Š” ๊ฑธ ์˜ˆ๋ฐฉํ•ด ์ค๋‹ˆ๋‹ค. ```sh { # ์—ฌ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์œผ์„ธ์š” } ``` - `cat << EOF...`๊ฐ™์€ "here documents"์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋‘์„ธ์š”. - Bash์—์„œ ํ‘œ์ค€ ์ถœ๋ ฅ(standard output)๊ณผ ํ‘œ์ค€ ์—๋Ÿฌ(standard error) ๋‘˜ ๋‹ค `some-command > logfile 2>&1`๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข…์ข…, ์ปค๋งจ๋“œ๊ฐ€ ์—ด๋ฆฐ ํŒŒ์ผ ํ•ธ๋“ค์„ ๋‚จ๊ธฐ์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์‹คํžˆ ํ•˜๊ธฐ ์œ„ํ•ด, ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ํ„ฐ๋ฏธ๋„์—์„œ ๋ช…๋ น์–ด์— `>> 2+3 5 ``` ## Processing files and data - ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ํŒŒ์ผ์„ ์ด๋ฆ„์œผ๋กœ ์ฐพ์œผ๋ ค๋ฉด `find . -iname '*something*'` (๋˜๋Š” ๋น„์Šทํ•˜๊ฒŒ)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์–ด๋Š ๊ณณ์— ์žˆ๋“  ํŒŒ์ผ์„ ์ด๋ฆ„์œผ๋กœ ์ฐพ์œผ๋ ค๋ฉด `locate something`์„ ์‚ฌ์šฉํ•˜์„ธ์š”(ํ•˜์ง€๋งŒ ์ธ๋‚ด๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. `updatedb`๊ฐ€ ์ตœ๊ทผ์— ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ์ธ๋ฑ์‹ฑํ•˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). - ์†Œ์Šค๋‚˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋“ค์—์„œ ์ผ๋ฐ˜์ ์ธ ๊ฒ€์ƒ‰์„ ํ•  ๋•Œ๋Š”(`grep -r`๋ณด๋‹ค ๋” ๋ณต์žกํ•  ๋•Œ), [`ag`](https://github.com/ggreer/the_silver_searcher)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - HTML์„ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ๋Š” `lynx -dump -stdin`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - ๋งˆํฌ๋‹ค์šด, HTML, ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฌธ์„œ ๋ณ€ํ™˜์—๋Š” [`pandoc`](http://pandoc.org/)์„ ์‹œ๋„ํ•ด๋ณด์„ธ์š”. - XML์„ ๋ฐ˜๋“œ์‹œ ๋‹ค๋ค„์•ผํ•œ๋‹ค๋ฉด, `xmlstarlet`์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์˜ค๋ž˜๋˜์—ˆ์ง€๋งŒ ์ข‹์Šต๋‹ˆ๋‹ค. - JSON์—๋Š” [`jq`](http://stedolan.github.io/jq/)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - YAML์—๋Š” [`shyaml`](https://github.com/0k/shyaml)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - Excel์ด๋‚˜ CSVํŒŒ์ผ์—๋Š” [csvkit](https://github.com/onyxfish/csvkit)๊ฐ€ `in2csv`, `csvcut`, `csvjoin`, `csvgrep`์™ธ ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. - Amazon S3๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” [`s3cmd`](https://github.com/s3tools/s3cmd)๊ฐ€ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  [`s4cmd`](https://github.com/bloomreach/s4cmd)๋Š” ๋น ๋ฆ…๋‹ˆ๋‹ค. Amazon์˜ [`aws`](https://github.com/aws/aws-cli)๋Š” ๋‹ค๋ฅธ AWS ๊ด€๋ จ ์ž‘์—…์— ํ•ต์‹ฌ์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. - `sort`์™€ `uniq`์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋‘์„ธ์š”. uniq์˜ `-u`, `-d`์˜ต์…˜์„ ํฌํ•จํ•ด์„œ ๋ง์ด์ฃ . ํ•˜๋‹จ์˜ one-liner๋ฅผ ๋ณด์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  `comm`๋„ ๋ณด์„ธ์š”. - ํ…์ŠคํŠธ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฃจ๋Š” `cut`, `paste` ๊ทธ๋ฆฌ๊ณ  `join`์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋‘์„ธ์š”. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด `cut`์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ `join`์— ๋Œ€ํ•ด์„œ๋Š” ์žŠ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. - `wc`๋ฅผ ์ด์šฉํ•ด์„œ ํ–‰(`-l`), ์บ๋ฆญํ„ฐ(`-m`), ๋‹จ์–ด(`-w`) ๊ทธ๋ฆฌ๊ณ  ๋ฐ”์ดํŠธ(`-c`)๋ฅผ ์„ธ๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์„ธ์š”. - `tee`๋ฅผ ์ด์šฉํ•ด์„œ `ls -al | tee file.txt`์ฒ˜๋Ÿผ, ํ‘œ์ค€ ์ž…๋ ฅ(stdin)์—์„œ ๋ณต์‚ฌํ•ด์„œ ํŒŒ์ผ๋กœ ๋ณด๋‚ด๊ฑฐ๋‚˜, ํ‘œ์ค€ ์ถœ๋ ฅ(stdout)์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์„ธ์š”. - ๊ทธ๋ฃน, ํ•„๋“œ ๋’ค์ง‘๊ธฐ, ํ†ต๊ณ„์ ์ธ ๊ณ„์‚ฐ ๊ฐ™์€ ์ข€ ๋” ๋ณต์žกํ•œ ๊ณ„์‚ฐ์€ [`datamash`](https://www.gnu.org/software/datamash/)๋ฅผ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”. - ๋กœ์ผ€์ผ์ด ์ปค๋งจ๋“œ ๋ผ์ธ ๋„๊ตฌ์— ์ •๋ ฌ ์ˆœ์„œ(collation)์™€ ํผํฌ๋จผ์Šค๋ฅผ ํฌํ•จํ•ด์„œ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์„ธ์š”. ๋Œ€๋ถ€๋ถ„์˜ ๋ฆฌ๋ˆ…์Šค ์„ค์น˜๋Š” `LANG`์ด๋‚˜ ๋‹ค๋ฅธ ๋กœ์ผ€์ผ ๋ณ€์ˆ˜๋ฅผ US English์™€ ๊ฐ™์€ ๋กœ์ปฌ ์„ธํŒ…์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋กœ์ผ€์ผ์„ ๋ฐ”๊ฟ€ ๊ฒฝ์šฐ ์ •๋ ฌ๋„ ๋ฐ”๋€” ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•˜์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  i18n ๋ฃจํ‹ด๋“ค๋„ ์ •๋ ฌ์ด๋‚˜ ๋‹ค๋ฅธ ์ปค๋งจ๋“œ๋“ค์„ *๋ช‡ ๋ฐฐ* ๋Š๋ฆฌ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `export LC_ALL=C`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋Š”( ๋ฐ‘์— ์žˆ๋Š” ์ง‘ํ•ฉ(set) ์ž‘์—…์ด๋‚˜, ์œ ์ผ์„ฑ ์ž‘์—…๋“ฑ) i18n์˜ ๋Š๋ฆฐ ๋ฃจํ‹ด๋“ค์„ ํ†ต์งธ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ „ํ†ต์ ์ธ ๋ฐ”์ดํŠธ ๊ธฐ๋ฐ˜์˜ ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - `TZ=Pacific/Fiji date`์ฒ˜๋Ÿผ ํŠน์ • ๋ช…๋ น์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‹คํ–‰ ์•ž์— ๋ถ™์—ฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ์กฐ์ž‘์„ ํ•  ๋•Œ `awk`์™€ `sed`๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ํ…์ŠคํŠธ ํŒŒ์ผ์˜ ์„ธ ๋ฒˆ์งธ ์—ด์˜ ์ˆซ์ž๋“ค์˜ ๋ชจ๋“  ๊ฐ’์„ ๋”ํ•˜๋Š” ๊ฒƒ์€ ์ด๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค: `awk '{ x += $3 } END { print x }'`. ์ด ๋ฐฉ๋ฒ•์€ ๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ณด๋‹ค 3๋ฐฐ ์ •๋„ ๋น ๋ฅด๊ณ , 1/3 ์ •๋„์˜ ๊ธธ์ด๋ฐ–์— ์•ˆ๋ฉ๋‹ˆ๋‹ค. - ์—ฌ๋Ÿฌ ํŒŒ์ผ ์•ˆ์˜ ๋ฌธ์ž์—ด์„ ๋ฐ”๊พธ๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์„ธ์š”. ```sh perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt ``` - ์—ฌ๋Ÿฌ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ž์—ด์„ ๋ฐ”๊ฟ€ ๋•Œ์—๋Š” [`repren`](https://github.com/jlevy/repren)๋ฅผ ์จ๋ณด์„ธ์š”. (์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” `rename` ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ชจ๋“  ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์—์„œ ๊ฐ™์€ ๋™์ž‘์„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•˜์„ธ์š”.) ```sh # ํŒŒ์ผ ์ด๋ฆ„, ๋””๋ ‰ํ„ฐ, ์ปจํ…์ธ  ๋ชจ๋‘ foo์—์„œ bar๋กœ ๋ณ€๊ฒฝ repren --full --preserve-case --from foo --to bar . # ๋ฐฑ์—… ํŒŒ์ผ์„ whatever.bak์—์„œ whatever๋กœ ๋ณต์› repren --renames --from '(.*)\.bak' --to '\1' *.bak # ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด rename์œผ๋กœ ์œ„์™€ ๊ฐ™์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Œ rename 's/\.bak$//' *.bak ``` - man ํŽ˜์ด์ง€๊ฐ€ ์ด์•ผ๊ธฐํ•˜๋“ฏ, `rsync`๋Š” ์ •๋ง ๋น ๋ฅด๊ณ  ๋‹ค์žฌ๋‹ค๋Šฅํ•œ ํŒŒ์ผ ๋ณต์‚ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ธฐ๊ธฐ ๊ฐ„์˜ ๋™๊ธฐํ™”์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์ง€๋งŒ, ๋กœ์ปฌ์—์„œ๋„ ์ถฉ๋ถ„ํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ทœ์ •์ด ํ—ˆ์šฉํ•œ๋‹ค๋ฉด, `scp` ๋Œ€์‹  `rsync`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ์ „์†กํ•˜๋Š” ๋Œ€์‹  ์ค‘๋‹จ๋œ ์ง€์ ๋ถ€ํ„ฐ ์žฌ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋งŽ์€ ์ˆ˜์˜ ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” [๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•](https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html)์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ```sh mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir ``` - `shuf`๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒŒ์ผ ์•ˆ์˜ ์ž„์˜์˜ ํ–‰์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜, ์„ž์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - `sort`์˜ ์˜ต์…˜์„ ์•Œ์•„๋‘์„ธ์š”. `-n`์€ ์ˆซ์ž๋ฅผ ์ •๋ ฌํ•  ๋•Œ, `-h`๋Š” ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ์ž‘์„ฑํ•œ ์ˆซ์ž์˜ ๊ฒฝ์šฐ(`du -h`์™€ ๊ฐ™์€ ํ˜•ํƒœ). ํ‚ค๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ์•„๋‘์„ธ์š”(`-t`์™€ `-k`). ํŠน๋ณ„ํžˆ, ์ฒซ ๋ฒˆ์งธ ํ•„๋“œ๋กœ๋งŒ ์ •๋ ฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด `-k1,1`์„ ์ ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑธ ์ฃผ์˜ํ•˜์„ธ์š”. `-k1`์€ ๋ชจ๋“  ํ–‰์— ๋Œ€ํ•ด์„œ ์ •๋ ฌํ•˜๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ ์ •๋ ฌ(`sort -s`)๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋จผ์ € 2๋ฒˆ ํ•„๋“œ๋กœ ์ •๋ ฌํ•˜๊ณ , ๊ทธ๋‹ค์Œ์— 1๋ฒˆ ํ•„๋“œ๋กœ ์ •๋ ฌํ•  ๊ฒฝ์šฐ, `sort -k1,1 | sort -s -k2,2`์ฒ˜๋Ÿผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ๋งŒ์•ฝ ํƒญ(tab)๋ฌธ์ž๋ฅผ Bash ์ปค๋งจ๋“œ ๋ผ์ธ์— ์‚ฌ์šฉํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์ƒ๊ธธ ๊ฒฝ์šฐ(์˜ˆ๋ฅผ ๋“ค๋ฉด -t argument๋ฅผ ์ด์šฉํ•ด ์ •๋ ฌ ํ•  ๋•Œ), **ctrl-v** **[Tab]**ํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ฑฐ๋‚˜, `$'\t'`๋ฅผ ์“ฐ์„ธ์š”(๋ฌธ์ž์ชฝ์ด ๋ณต์‚ฌ๋‚˜ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค.). - ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํŒจ์น˜ํ•˜๋Š” ๊ธฐ๋ณธ ๋„๊ตฌ๋Š” `diff`์™€ `patch`์ž…๋‹ˆ๋‹ค. diff์™€ `sdiff`(์ƒˆ๋กœ diff)์˜ ํ†ต๊ณ„ ์š”์•ฝ์„ ๋ณด๋ ค๋ฉด `diffstat`๋ฅผ ๋ณด์„ธ์š”. `diff -r`์€ ๋ชจ๋“  ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฑธ ์•Œ์•„๋‘์„ธ์š”. `diff -r tree1 tree2 | diffstat`์œผ๋กœ ๋ณ€๊ฒฝ ๋‚ด์—ญ์˜ ์š”์•ฝ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ hex ๋คํ”„๋ฅผ ๋œจ๊ณ  ์‹ถ์„ ๋•Œ๋Š” `hd`, `hexdump`, `xxd`๋ฅผ ์“ฐ์„ธ์š”. ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ๋•Œ๋Š” `bvi`, `biew`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - `strings` (๊ทธ๋ฆฌ๊ณ  `grep`, ๋“ฑ) ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ์•ˆ์—์„œ ๋ฌธ์ž์—ด ๋น„ํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ diffํ•˜๋ ค๋ฉด(๋ธํƒ€ ์••์ถ•), `xdelta3`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - ํ…์ŠคํŠธ ํŒŒ์ผ ์ธ์ฝ”๋”ฉ์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด `iconv`๋ฅผ ์‹œ๋„ํ•ด๋ณด์„ธ์š”. ๋˜๋Š” `uconv`๋Š” ๋” ๋ณต์žกํ•œ ๋ชฉ์ ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `uconv`๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ณต์žกํ•œ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์†Œ๋ฌธ์žํ™”ํ•˜๊ณ  ๋ชจ๋“  ์•…์„ผํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š”(ํ™•์žฅํ•˜๊ณ , ๋–จ์–ดํŠธ๋ฆฌ๋Š” ๊ฒƒ์„ ์ด์šฉํ•ด์„œ) ์ปค๋งจ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ```sh uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt ``` - ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„๋ ค๋ฉด `split`(ํŒŒ์ผ์„ ์‚ฌ์ด์ฆˆ๋กœ ๋‚˜๋ˆ”)์ด๋‚˜ `csplit`(ํŒŒ์ผ์„ ํŒจํ„ด์œผ๋กœ ๋‚˜๋ˆ”)์„ ๋ณด์„ธ์š”. - ๋‚ ์งœ ์‹œ๊ฐ„ ํ‘œํ˜„์‹์„ ์ œ์–ดํ•˜๋ ค๋ฉด [`dateutils`](http://www.fresse.org/dateutils/)์˜ `dateadd`, `datediff`, `strptime`๋“ฑ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. - `zless`, `zmore`, `zcat` ๊ทธ๋ฆฌ๊ณ `zgrep`์„ ์ด์šฉํ•ด์„œ ์••์ถ•๋œ ํŒŒ์ผ์— ๋Œ€ํ•ด ์ž‘์—…ํ•˜์„ธ์š”. - ํŒŒ์ผ ์†์„ฑ์€ `chattr`๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŒŒ์ผ ๊ถŒํ•œ์— ๋Œ€ํ•œ ์ €๋ ˆ๋ฒจ ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด `sudo chattr +i /critical/directory/or/file`๋กœ ๋ถˆ๋ณ€ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ถ™์—ฌ ์‹ค์ˆ˜๋กœ ํŒŒ์ผ์„ ์ง€์šฐ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - `getfacl`, `setfacl`๋ฅผ ์‚ฌ์šฉํ•ด ํŒŒ์ผ ๊ถŒํ•œ์„ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ```sh getfacl -R /some/path > permissions.txt setfacl --restore=permissions.txt ``` ## System debugging - ์›น ๋””๋ฒ„๊น…์„ ์œ„ํ•ด์„œ๋Š” `curl` ์™€ `curl -I` ๊ฐ€ ๋„์›€์ด ๋˜๊ณ , `wget`๋„ ๊ฝค ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ์— ๋ณด๋‹ค ํ˜„๋Œ€์ ์ธ ๋ฐฉ์‹์œผ๋กœ๋Š” [`httpie`](https://github.com/jakubroztocil/httpie)์ด ์žˆ์Šต๋‹ˆ๋‹ค. - cpu/๋””์Šคํฌ์˜ ์ƒํƒœ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” `top` (ํ˜น์€ ๋” ๋‚˜์€ ๋ช…๋ น์–ด์ธ `htop`), `iostat`, `iotop`์„ ์‚ฌ์šฉํ•˜์„ธ์š”. `iostat -mxz 15`๋ฅผ ์‚ฌ์šฉํ•ด ๊ธฐ๋ณธ CPU์™€ ํŒŒํ‹ฐ์…˜ ๋””์Šคํฌ๋ณ„ ์ •๋ณด์™€ ์„ฑ๋Šฅ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ๋„คํŠธ์›Œํฌ ์ƒํƒœ๋ฅผ ์ž์„ธํžˆ ์•Œ๋ ค๋ฉด `netstat`, `ss`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - ์‹œ์Šคํ…œ์— ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ๋ณด๋ ค๋ฉด `dstat`๊ฐ€ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณด๋‹ค ์‹œ์Šคํ…œ์˜ ์‹ฌ์ธต์ ์ธ ๋ฉด๋“ค์„ ๋ณด๋ ค๋ฉด [`glances`](https://github.com/nicolargo/glances)๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”. - ๋ฉ”๋ชจ๋ฆฌ์˜ ์ƒํƒœ๋ฅผ ์•Œ์•„๋ณด๋ ค๋ฉด `free` ์™€ `vmstat`๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ•ด์„ํ•ด๋ณด์„ธ์š”. ํŠนํžˆ, "cached" ๊ฐ’์€ Linux kernel์— ์˜ํ•ด file cache๋กœ ์žกํ˜€์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ณ  ๊ทธ๋ž˜์„œ "free"๊ฐ’์— ๋Œ€ํ•ด์„œ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - Java ์‹œ์Šคํ…œ์˜ ๋””๋ฒ„๊น…์€ ์กฐ๊ธˆ ๋‹ค๋ฅธ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Oracle๊ณผ ๊ทธ ์™ธ์˜ ํšŒ์‚ฌ์—์„œ ๋งŒ๋“  ๋‹ค๋ฅธ JVM๋“ค์—์„œ๋Š” `kill -3 `๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ „์ฒด stack trace ์ •๋ณด์™€ heap์˜ ์ •๋ณด(์‹œ๊ธฐ๋ณ„๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ์„ธ๋ถ€์ ์ธ ๋‚ด์šฉ ๊ฐ™์€ ๋งค์šฐ ์œ ์šฉํ•œ ์ •๋ณด)๋ฅผ ์š”์•ฝํ•˜์—ฌ stderr๋‚˜ ๋กœ๊ทธ๋กœ ์ถœ๋ ฅํ•ด์ฃผ๋ฏ€๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ณด๋ฅผ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JDK์˜ `jps`, `jstat`, `jstack`, `jmap` ๋ช…๋ น์€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. [SJK tools](https://github.com/aragozin/jvm-tools)์€ ๋” ๊ณ ๊ธ‰ ์ •๋ณด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ๋„คํŠธ์›Œํฌ ์ด์Šˆ๋“ค์„ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” traceroute๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋” ์ข‹์€ [`mtr`](http://www.bitwizard.nl/mtr/)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - ๋””์Šคํฌ๊ฐ€ ์™œ ๊ฐ€๋“ ์ฐผ๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ [`ncdu`](https://dev.yorhel.nl/ncdu)๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” `du -sh *`์™€ ๊ฐ™์€ ์ปค๋งจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ์–ด๋– ํ•œ ์†Œ์ผ“์ด๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์—ญํญ(bandwidth)๋ฅผ ์ฐพ์•„๋ณด๋ ค๋ฉด [`iftop`](http://www.ex-parrot.com/~pdw/iftop/)๋‚˜ [`nethogs`](https://github.com/raboof/nethogs)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - `ab`๋ผ๋Š” ํˆด(Apache์— ๋”ธ๋ ค์žˆ๋Š”)์€ ์‹ ์†ํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ(quick-and-dirty) ์›น์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์„ ์ฒดํฌํ•˜๋Š”๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณด๋‹ค ๋ณต์žกํ•œ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๋•Œ๋Š” `siege`๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”. - ๋ณด๋‹ค ์‹ฌ๊ฐํ•œ ๊ฒฝ์šฐ์˜ ๋„คํŠธ์›Œํฌ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด์„œ๋Š” [`wireshark`](https://wireshark.org/), [`tshark`](https://www.wireshark.org/docs/wsug_html_chunked/AppToolstshark.html), [`ngrep`](http://ngrep.sourceforge.net/)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - `strace` ์™€ `ltrace`์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์„ธ์š”. ์ด ์ปค๋งจ๋“œ๋“ค์€ ๋งŒ์ผ ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์—์„œ failing, hanging ํ˜น์€ crashing์ด ์ผ์–ด๋‚˜๊ฑฐ๋‚˜ ๊ทธ ์™ธ์— ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฌด์Šจ ์ด์œ ์ธ์ง€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด๋‚˜ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ๋Œ€๋žต์ ์ธ ๋‚ด์šฉ์„ ์–ป๊ณ ์ž ํ•  ๋•Œ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ํ”„๋กœํŒŒ์ผ๋ง์„ ์œ„ํ•œ ์˜ต์…˜(`-c`)๊ณผ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์— ๋ถ™์ด๊ธฐ ์œ„ํ•œ ์˜ต์…˜(`-p`)์„ ๊ธฐ์–ตํ•˜์„ธ์š”. - ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(shared libraries) ๋“ฑ์„ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” `ldd`์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์„ธ์š”. - `gdb`๋ฅผ ๊ฐ€์ง€๊ณ  ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ  ๊ทธ ํ”„๋กœ์„ธ์Šค์˜ stack trace๋“ค์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”. - `/proc`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด๊ฒƒ์€ ํ˜„์žฌ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•  ๋•Œ ์ข…์ข… ๋†€๋ž๋„๋ก ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ:`/proc/cpuinfo`, `/proc/meminfo`, `/proc/cmdline`, `/proc/xxx/cwd`, `/proc/xxx/exe`, `/proc/xxx/fd/`, `/proc/xxx/smaps` (`xxx`๋Š” ํ”„๋กœ์„ธ์Šค id๋‚˜ pid์ž…๋‹ˆ๋‹ค). - ๊ณผ๊ฑฐ์— ์™œ ๋ฌด์—‡์ธ๊ฐ€๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€๋ฅผ ๋””๋ฒ„๊น…ํ•  ๋•Œ์—๋Š” [`sar`](http://sebastien.godard.pagesperso-orange.fr/)๊ฐ€ ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ปค๋งจ๋“œ๋Š” CPU, memory, network ๋“ฑ์˜ ํ†ต๊ณ„ ๋‚ด์—ญ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. - ์‹œ์Šคํ…œ์˜ ๋ณด๋‹ค ๊นŠ์€ ๊ณณ์„ ๋ณด๊ฑฐ๋‚˜ ํผํฌ๋จผ์Šค๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, `stap` ([SystemTap](https://sourceware.org/systemtap/wiki)), [`perf`](http://en.wikipedia.org/wiki/Perf_(Linux)), [`sysdig`](https://github.com/draios/sysdig)๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”. - ์—ฌ๋Ÿฌ๋ถ„์ด ์‚ฌ์šฉํ•˜๋Š” Linux์˜ ๋ฐฐํฌํŒ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธ(๋Œ€๋ถ€๋ถ„์˜ ๋ฐฐํฌํŒ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค)ํ•˜๋ ค๋ฉด `uname`์ด๋‚˜ `uname -a` ๋˜๋Š” `lsb_release -a`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - ์–ธ์ œ๋“ ์ง€ ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ •๋ง๋กœ ์žฌ๋ฏธ์žˆ๋Š” ๋ฐ˜์‘์„ ๋ณด์ธ๋‹ค๋ฉด `dmesg`๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”(์•„๋งˆ๋„ ํ•˜๋“œ์›จ์–ด๋‚˜ ๋“œ๋ผ์ด๋ฒ„์˜ ๋ฌธ์ œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค). - ํŒŒ์ผ์„ ์‚ญ์ œํ–ˆ๋Š”๋ฐ `du`๋กœ ํ™•์ธํ•ด ์˜ˆ์ƒํ•œ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด, ํŒŒ์ผ์ด ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ์‚ฌ์šฉ ์ค‘์ธ์ง€ ํ™•์ธํ•ด๋ณด์„ธ์š”. `lsof | grep deleted | grep "filename-of-my-big-file"` ## One-liners ์ปค๋งจ๋“œ๋“ค์„ ํ•œ๋ฐ ๋ฌถ์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ๋“ค - `sort`/`uniq`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ํŒŒ์ผ์˜ ๊ต์ฐจ์ , ์กฐํ•ฉ, ์ฐจ์ด์ ์„ ํ™•์ธ์ด ํ•„์š”ํ•  ๋•Œ ์ƒ๋‹นํ•œ ๋„์›€์ด ๋  ๊ฒ๋‹ˆ๋‹ค. ๊ฐ€๋ น `a`์™€ `b`๊ฐ€ ์œ ์ผํ•œ ๊ฐ’๋“ค๋งŒ์„ ๊ฐ€์ง„ ํ…์ŠคํŠธ ํŒŒ์ผ์ด๋ผ ํ•ฉ์‹œ๋‹ค. ์ด๊ฒƒ์ด ์ž„์˜์˜ ํฌ๊ธฐ์ธ ํŒŒ์ผ์„(๊ทธ๊ฒŒ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ๋ผ๊ณ  ํ•ด๋„) ๋น ๋ฅด๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (Sort๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์— ๊ฑธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค๋งŒ, ๋งŒ์•ฝ ๋ฃจํŠธ ํŒŒํ‹ฐ์…˜์ด ์ž‘์€ ๊ฒฝ์šฐ, `/tmp`๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด `-T`์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.) ์œ„์˜ `LC_ALL`์—๋Œ€ํ•œ ๋‚ด์šฉ์€ `sort`์˜ `-u`์˜ต์…˜์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. (์•„๋ž˜ ์˜ˆ์ œ์— ์ง‘์ค‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒ๋žต) ```sh cat a b | sort | uniq > c # c is a union b cat a b | sort | uniq -d > c # c is a intersect b cat a b b | sort | uniq -u > c # c is set difference a - b ``` - `grep . *`์„ ์‚ฌ์šฉํ•ด์„œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ๋น„์ฃผ์–ผํ•˜๊ฒŒ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(r๊ฐ ์ค„์€ ํŒŒ์ผ ์ด๋ฆ„๊ณผ ๊ฐ™์ด ๋‚˜์˜ต๋‹ˆ๋‹ค) ์•„๋‹ˆ๋ฉด `head -100 *`๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.(๊ฐ ํŒŒ์ผ์˜ ํ•ด๋”๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ์ด๋Š” `/sys`, `/proc`, `/etc` ๊ฐ™์ด ์„ค์ •๊ฐ’๋“ค๋กœ ๊ฐ€๋“ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. - ํ…์ŠคํŠธ ํŒŒ์ผ์˜ ์„ธ ๋ฒˆ์งธ ์—ด์˜ ์ˆซ์ž๋“ค์˜ ๋ชจ๋“  ๊ฐ’์„ ๋”ํ•˜๋Š” ๊ฒƒ์€ ์ด๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ณด๋‹ค 3๋ฐฐ ์ •๋„ ๋น ๋ฅด๊ณ , 1/3 ์ •๋„์˜ ๊ธธ์ด๋ฐ–์— ์•ˆ๋ฉ๋‹ˆ๋‹ค. ```sh awk '{ x += $3 } END { print x }' myfile ``` - ํŒŒ์ผ ํŠธ๋ฆฌ์—์„œ ํฌ๊ธฐ์™€ ๋‚ ์งœ๋ฅผ ๋ณด๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•˜์„ธ์š”. ์ด ๋ช…๋ น์–ด๋Š” `ls -l`์„ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ง€๋งŒ, `ls -lR`๋ณด๋‹ค ๋” ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ```sh find . -type f -ls ``` - ์›น์„œ๋ฒ„ ๋กœ๊ทธ ๊ฐ™์€ ํ…์ŠคํŠธ ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  URL ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋‚˜ํƒ€๋‚˜๋Š” `acct_id`๊ฐ™์€ ํŠน์ • ๊ฐ’์ด ๋ช‡๋ช‡ ํ–‰์— ๋‚˜ํƒ€๋‚œ๋‹ค๊ณ  ํ•ด๋ณด์ฃ . ๊ฐ๊ฐ์˜ `acct_id`์— ๋Œ€ํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์š”์ฒญ์ด ์žˆ์—ˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```sh cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn ``` - ๋ณ€๊ฒฝ์„ ๊ณ„์† ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ ค๋ฉด `watch`๋ฅผ ์ด์šฉํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด `watch -d -n 2 'ls -rtlh | tail'`๋กœ ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜, `watch -d -n 2 ifconfig`๋กœ ์™€์ดํŒŒ์ด ์„ค์ •์„ ๊ณ ์น  ๋•Œ ๋„คํŠธ์›Œํฌ ์„ค์ • ๋ณ€๊ฒฝ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด ๋ฌธ์„œ์— ์žˆ๋Š” ํŒ ์ค‘ ์ž„์˜์˜ ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋งˆํฌ๋‹ค์šด์„ ํŒŒ์‹ฑํ•˜๊ณ  ํ•ญ๋ชฉ์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค). ```sh function taocl() { curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md | pandoc -f markdown -t html | xmlstarlet fo --html --dropdtd | xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" | xmlstarlet unesc | fmt -80 } ``` ## Obscure but useful - `expr`: ์‚ฐ์ˆ ์ ์ด๊ฑฐ๋‚˜ ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ •๊ทœํ‘œํ˜„์‹์„ ๊ฒ€์ฆํ• ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `m4`: ๊ฐ„๋‹จํ•œ ๋ฉ”ํฌ๋กœ ์ˆ˜ํ–‰๊ธฐ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค - `yes`: ์–ด๋– ํ•œ ํ•œ ๋ฌธ์žฅ์„ ๋งค์šฐ ๋งŽ์ด ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค - `cal`: ๊ฐ„๋‹จํ•œ ๋‹ฌ๋ ฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `env`: ์–ด๋–ค ํ•œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค(์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค) - `printenv`: ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋“ค์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค(๋””๋ฒ„๊น…์„ ํ• ๋•Œ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค) - `look`: ์–ด๋–ค ๋ฌธ์ž์—ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ์˜๋‹จ์–ด(ํ˜น์€ ํŒŒ์ผ์˜ ์–ด๋–ค ํ•œ ์ค„)์„ ์ฐพ์Šต๋‹ˆ๋‹ค - `cut `, `paste`, `join`: ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ• ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `fmt`: ๋ฌธ๋‹จ์˜ ์„œ์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค - `pr`: ๋ฌธ์„œ์˜ ํŽ˜์ด์ง€๋‚˜ ์ปฌ๋Ÿผ ์„œ์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค - `fold`: ๋ฌธ์„œ์˜ ๊ฐ ๋ผ์ธ๋“ค์„ ํŠน์ •ํ•œ ๊ธธ์ด์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค - `column`: ๋ฌธ์„œ์˜ ์ปฌ๋Ÿผ์ด๋‚˜ ํ…Œ์ด๋ธ”์˜ ์„œ์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค - `expand`, `unexpand`: ํƒญ์„ ๊ณต๋ฐฑ์œผ๋กœ ๋ฐ”๊พธ์–ด์ฃผ๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์„ ํƒญ์œผ๋กœ ๋ฐ”๊พธ์–ด์ค๋‹ˆ๋‹ค - `nl`: ์ค„ ๋ฒˆํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค - `seq`: ์ˆซ์ž๋“ค์„ ์ถœ๋ ฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `bc`: ๊ฐ„๋‹จํ•œ ๊ณ„์‚ฐ๊ธฐ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค - `factor`: ์ •์ˆ˜๋“ค์„ ์ธ์ˆ˜๋ถ„ํ•ดํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - [`gpg`](https://gnupg.org/): ํŒŒ์ผ๋“ค์„ ์•”ํ˜ธํ™”ํ•˜๊ณ  ์„œ๋ช…ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `toe`: terminfo ์—”ํŠธ๋ฆฌ๋“ค์˜ ํ…Œ์ด๋ธ”(table of terminfo entries) - `nc`: ๋„คํŠธ์›Œํฌ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `socat`: ์†Œ์ผ“ ๋ฆด๋ ˆ์ด๋‚˜ TCP ํฌํŠธ๋กœ ๋‚ด์šฉ์„ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(`netcat`๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค) - [`slurm`](https://github.com/mattthias/slurm): ๋„คํŠธ์›Œํฌ ์ƒํ™ฉ์„ ์‹œ๊ฐํ™”ํ•˜์—ฌ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `dd`: ํŒŒ์ผ๋“ค์ด๋‚˜ ๋””๋ฐ”์ด์Šค๋“ค ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธธ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `file`: ํŒŒ์ผ์˜ ์ข…๋ฅ˜๋ฅผ ์•Œ์•„๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `tree`: ๋””๋ ‰ํ„ฐ๋ฆฌ๋“ค๊ณผ ๊ทธ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งˆ์น˜ ls๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ž…๋ ฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `stat`: ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `time`: ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  ์‹œ๊ฐ„์„ ์žฝ๋‹ˆ๋‹ค - `timeout`: ํŠน์ • ์‹œ๊ฐ„๋งŒํผ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  ์‹œ๊ฐ„์ด ๋๋‚˜๋ฉด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. - `lockfile`: `rm -f`๋กœ๋งŒ ์ง€์šธ ์ˆ˜ ์žˆ๋Š” ์„ธ๋งˆํฌ์–ด ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค - `logrotate`: ๋กœ๊ทธ๋ฅผ ๋กœํ…Œ์ดํŠธ, ์••์ถ•, ๋ฉ”์ผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค - `watch`: ๋ช…๋ น์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰ํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ์„ ํ•˜์ผ๋ผ์ดํŠธํ•ฉ๋‹ˆ๋‹ค - `tac`: ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์—ญ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค - `shuf`: ํŒŒ์ผ์˜ ๊ฐ ์ค„๋“ค์„ ์ž„์˜์˜ ์ˆœ์„œ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค - `comm`: ์ •๋ ฌ๋œ ํŒŒ์ผ๋“ค์„ ๊ฐ ๋ผ์ธ๋ณ„๋กœ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค - `pv`: ํŒŒ์ดํ”„๋ฅผ ํ†ตํ•ด์„œ ํ”„๋กœ์„ธ์Šค์˜ ์ •๋ณด๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `hd` and `bvi`: ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋คํ”„๋ฅผ ์–ป์–ด์˜ค๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `strings`: ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ๋“ค์—์„œ ํŠน์ • ๋ฌธ์žฅ์„ ์ถ”์ถœํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `tr`: ๋ฌธ์ž๋ฅผ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `iconv` or `uconv`: ๋ฌธ์„œ์˜ ์ธ์ฝ”๋”ฉ๋ฐฉ์‹์„ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `split `and `csplit`: ํŒŒ์ผ๋“ค์„ ์ชผ๊ฐœ๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `sponge`: ์“ฐ๊ธฐ ์ „์— ๋ชจ๋“  ์ž…๋ ฅ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ํŒŒ์ผ์—์„œ ์ฝ์€ ํ›„์— ์“ฐ๊ธฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด `grep -v something some-file | sponge some-file`์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - `units`: ๋‹จ์œ„๋ฅผ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค ์˜ˆ๋ฅผ๋“ค์–ด furlongs/fortnight ๋‹จ์œ„๋ฅผ twips/blink๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค (`/usr/share/units/definitions.units`๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”) - `apg`: ๋ Œ๋ค ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค - `xz`: ๊ณ ํšจ์œจ์˜ ํŒŒ์ผ ์••์ถ•ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค - `ldd`: ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `nm`: ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค์— ํฌํ•จ๋œ ์‹ฌ๋ณผ์ •๋ณด๋ฅผ ์–ป์–ด์˜ต๋‹ˆ๋‹ค - `ab`: ์›น ์„œ๋ฒ„๋ฅผ ๋ฒค์น˜ ๋งˆํ‚นํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `strace`: ์‹œ์Šคํ…œ ์ฝœ์„ ๋””๋ฒ„๊น…ํ• ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - [`mtr`](http://www.bitwizard.nl/mtr/): ๋„คํŠธ์›Œํฌ ๋””๋ฒ„๊น…์‹œ์— traceroute๋ณด๋‹ค ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค - `cssh`: ์‰˜์„ ๋™์‹œ์— ์—ฌ๋Ÿฌ๊ฐœ ์‚ฌ์šฉํ• ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - `rsync`: SSH๋ฅผ ์ด์šฉํ•ด ์›๊ฒฉ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด๋‚˜, ๋กœ์ปฌ ํŒŒ์ผ์‹œ์Šคํ…œ์˜ ํŒŒ์ผ๊ณผ ํด๋”๋“ค์„ ๋™๊ธฐํ™” ํ• ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - [`wireshark`](https://wireshark.org/), [`tshark`](https://www.wireshark.org/docs/wsug_html_chunked/AppToolstshark.html): ํŒจํ‚ท์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋„คํŠธ์›Œํ‚น์„ ๋””๋ฒ„๊น…ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค - [`ngrep`](http://ngrep.sourceforge.net/): ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ grep๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค - `host`, `dig`: DNS ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `lsof`: ํ”„๋กœ์„ธ์Šค ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์™€ ์†Œ์ผ“์˜ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `dstat`: ์œ ์šฉํ•œ ์‹œ์Šคํ…œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - [`glances`](https://github.com/nicolargo/glances): ๋ณด๋‹ค ๊ณ ์ฐจ์›์˜ ์—ฌ๋Ÿฌ ์„œ๋ธŒ์‹œ์Šคํ…œ๋“ค์˜ ์ •๋ณด๋ฅผ ํ•œ๋ฒˆ์— ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `iostat`: ๋””์Šคํฌ์˜ ์‚ฌ์šฉ๋Ÿ‰ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `mpstat`: CPU ์‚ฌ์šฉ๋Ÿ‰ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. - `vmstat`: ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. - `htop`: ๋ณด๋‹ค ๊ฐœ์„ ๋œ ํ˜•ํƒœ์˜ top์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `last`: ๋กœ๊ทธ์ธ ํ–ˆ๋˜ ์ •๋ณด๋“ค์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `w`: ํ˜„์žฌ ๋ˆ„๊ฐ€ ๋กœ๊ทธ์ธํ–ˆ๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `id`: ํ˜„์žฌ ์œ ์ €๋‚˜ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ์‹๋ณ„ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - [`sar`](http://sebastien.godard.pagesperso-orange.fr/): ์‹œ์Šคํ…œ ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - [`iftop`](http://www.ex-parrot.com/~pdw/iftop/), [`nethogs`](https://github.com/raboof/nethogs): ์†Œ์ผ“ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ๋ฅผ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `ss`: ์†Œ์ผ“์— ๊ด€ํ•œ ํ†ต๊ณ„์ž๋ฃŒ๋“ค์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `dmesg`: ๋ถ€ํŒ… ๋ฉ”์‹œ์ง€์™€ ์‹œ์Šคํ…œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋“ค์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `sysctl`: ์‹คํ–‰ ์‹œ์— ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค - `hdparm`: SATA/ATA disk๋“ค์˜ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๊ทธ๊ฒƒ๋“ค์ด ์ž‘๋™ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค - `lsblk`: ๋ธ”๋ก ๋””๋ฐ”์ด์Šค๋“ค์˜ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค : ์—ฌ๋Ÿฌ๋ถ„์˜ ๋””์Šคํฌ๋“ค์ด๋‚˜ ๋””์ŠคํฌํŒŒํ‹ฐ์…˜๋“ค์„ ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: CPU, BIOS, RAID, graphics, devices ๋“ฑ์˜ ํ•˜๋“œ์›จ์–ด ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค - `lsmod`, `modifno`: ์ปค๋„ ๋ชจ๋“ˆ์˜ ์ƒ์„ธ์ •๋ณด๋ฅผ ๋ชฉ๋ก์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. - `fortune`, `ddate`, `sl`: ์—... ์ฆ๊ธฐ๊ธฐ๊ด€์ฐจ๋ฅผ ์ƒ๊ฐํ•˜๊ณ ์žˆ๊ณ  ๊ทธ๊ฒƒ์„ ์ธ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๊ฒƒ์€ "์œ ์šฉ"ํ•ฉ๋‹ˆ๋‹ค ## OS X only *OS X์—์„œ๋งŒ* ํ•ด๋‹น๋˜๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. - `brew` (Homebrew)๋‚˜ `port` (MacPorts)๋ฅผ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ๋งŽ์€ ๋ช…๋ น์–ด๋ฅผ OS X์— ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - `pbcopy`๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ช…๋ น์–ด ์ถœ๋ ฅ๋ฌผ์„ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ `pbpaste`๋ฅผ ์ด์šฉํ•ด ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - OS X ํ„ฐ๋ฏธ๋„์—์„œ ์˜ต์…˜ ํ‚ค๋ฅผ ์•ŒํŠธ ํ‚ค(**alt-b**, **alt-f** ๊ฐ™์€ ์œ„์— ๋‚˜์˜จ ๋ช…๋ น)๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Preferences -> Profiles -> Keyboard๋ฅผ ์—ด์–ด "Use Option as Meta key"๋ฅผ ์„ ํƒํ•˜์„ธ์š”. - ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŒŒ์ผ์„ ์—ด๊ธฐ์œ„ํ•ด, `open` ๋˜๋Š” `open -a /Applications/Whatever.app`์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. - Spotlight: `mdfind`๋ฅผ ์ด์šฉํ•ด ํŒŒ์ผ์„ ์ฐพ๊ณ , `mdls`๋ฅผ ์ด์šฉํ•ด ๋ฉ”ํƒ€๋ฐ์ดํƒ€ (์‚ฌ์ง„ EXIF ์ •๋ณด์™€ ๊ฐ™์€) ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - OS X๋Š” BSD Unix ๊ธฐ๋ฐ˜์ด๋ฉฐ ๋งŽ์€ ๋ช…๋ น์–ด๋“ค์„ (์˜ˆ๋กœ `ps`, `ls`, `tail`, `awk`, `sed`) ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ๋“ค์€ Linux ๋ฒ„์ „๋“ค๊ณผ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํฌ๊ฒŒ๋Š” System V-style Unix์™€ GNU ๋„๊ตฌ๋“ค์— ๋งŽ์€ ์˜ํ–ฅ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋‚ด์šฉ๋“ค์„ man ํŽ˜์ด์ง€ ์ƒ๋‹จ์˜ "BSD General Commands Manual." ๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋”์€ GNU ๋ฒ„์ „์ด ์„ค์น˜๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ๋กœ, GNU awk์™€ sed์ธ `gawk`์™€ `gsed`์—์„œ). ๋งŒ์•ฝ ์ด์ข… ํ”Œ๋žซํผ ๊ฐ„ Bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด, ๋™์ผํ•œ ๋ช…๋ น์–ด (์˜ˆ๋กœ, ํŒŒ์ด์ฌ์ด๋‚˜ `perl`๊ณผ ๊ฐ™์€)๋‚˜ ํ…Œ์ŠคํŠธ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - OS X ๋ฆด๋ฆฌ์Šค ์ •๋ณด๋ฅผ ์–ป์œผ์‹œ๋ ค๋ฉด, `sw_vers`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ## Windows only Windows*์—์„œ๋งŒ* ํ•ด๋‹น๋˜๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. - Windows 10์—์„œ๋Š” [Bash on Ubuntu on Windows](https://msdn.microsoft.com/commandline/wsl/about)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์œ ๋‹‰์Šค ์ปค๋งจ๋“œ ๋ผ์ธ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์นœ์ˆ™ํ•œ Bash ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์ ์€, ๋ฆฌ๋ˆ…์Šค ํ”„๋กœ๊ทธ๋žจ์„ Windows์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Bash์—์„œ Windows ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. - [Cygwin](https://cygwin.com/)๋ฅผ ์„ค์น˜ํ•ด Microsoft Windows์—์„œ ์œ ๋‹‰์Šค ์…ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์— ๊ธฐ์ˆ ๋œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒƒ๋“ค์€ ๊ทธ๋Œ€๋กœ ๋™์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. - Cygwin์˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ ์œ ๋‹‰์Šค ํ”„๋กœ๊ทธ๋žจ์„ ๋” ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ์ปค๋งจ๋“œ ๋ผ์ธ ์ฐฝ์œผ๋กœ `mintty`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - Windows์˜ ํด๋ฆฝ๋ณด๋“œ๋ฅผ `/dev/clipboard`๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - `cygstart`์„ ์‹คํ–‰ํ•ด ๋“ฑ๋ก๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•ด ์ž„์˜์˜ ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - Windows ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” `regtool`๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - `C:\\` Windows ๋“œ๋ผ์ด๋ธŒ ๊ฒฝ๋กœ๋Š” Cygwin์—์„œ๋Š” `/cygdrive/c`๊ฐ€ ๋˜๊ณ , Cygwin์˜ `/` Windows์—์„œ `C:\cygwin`๊ฐ€ ๋˜๋Š”๊ฒƒ์„ ์•Œ์•„ ๋‘์„ธ์š”. Cygwin๊ณผ Windows ์Šคํƒ€์ผ์˜ ํŒŒ์ผ ํŒจ์Šค๋Š” `cygpath`๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Windows ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. - You can perform and script most Windows system administration tasks from the command line by learning and using `wmic`. - Windows์—์„œ ์œ ๋‹‰์Šค ๋ฃฉ์—”ํ•„์„ ์–ป๋Š” ๋‹ค๋ฅธ ๋Œ€์•ˆ์€ [Cash](https://github.com/dthree/cash)์ž…๋‹ˆ๋‹ค. ์ด ํ™˜๊ฒฝ์—๋Š” ๋งค์šฐ ์ ์€ ์œ ๋‹‰์Šค ๋ช…๋ น๊ณผ ์ปค๋งจ๋“œ ๋ผ์ธ ์˜ต์…˜๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ˆ ์ฃผ์˜ํ•˜์„ธ์š”. - Windows์—์„œ GNU ๊ฐœ๋ฐœ์ž ํˆด(GCC๊ฐ™์€)์„ ์–ป๋Š” ๋‹ค๋ฅธ ๋Œ€์•ˆ์œผ๋กœ [MinGW](http://www.mingw.org/)์™€ ๊ฑฐ๊ธฐ์— ํฌํ•จ๋œ [MSYS](http://www.mingw.org/wiki/msys) ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” bash, gawk, make, grep๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. MSYS๋Š” Cygwin์— ๋น„๊ตํ•˜๋ฉด ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ์—†์Šต๋‹ˆ๋‹ค. MinGW๋Š” ์œ ๋‹‰์Šค ํˆด์„ ๋„ค์ดํ‹ฐ๋ธŒ Windows๋กœ ํฌํŒ…ํ•  ๋•Œ ๋ถ€๋ถ„์ ์œผ๋กœ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ## More resources - [awesome-shell](https://github.com/alebcay/awesome-shell): ์…ธ์— ๋Œ€ํ•œ ํˆด๊ณผ ๋ฆฌ์†Œ์Šค๋“ค์ด ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. - [awesome-osx-command-line](https://github.com/herrbischoff/awesome-osx-command-line): OS X ์ปค๋งจ๋“œ ๋ผ์ธ์— ๊ด€ํ•ด ๋” ๊นŠ์ด ์•Œ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ด๋“œ ์ž…๋‹ˆ๋‹ค. - [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/): ๋ณด๋‹ค ๋‚˜์€ ์…ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๊ธ€์ž…๋‹ˆ๋‹ค. - [shellcheck](https://github.com/koalaman/shellcheck): ์…ธ ์Šคํฌ๋ฆฝํŠธ ์ •์  ๋ถ„์„ ๋„๊ตฌ ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, bash/sh/zsh์— ๋Œ€ํ•œ ๋ฆฐํŠธ์ž…๋‹ˆ๋‹ค. - [Filenames and Pathnames in Shell](http://www.dwheeler.com/essays/filenames-in-shell.html): ์…ธ ์Šคํฌ๋ฆฝํŠธ์—์„œ ํŒŒ์ผ ์ด๋ฆ„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฒ•์„ ๋‹ค๋ฃจ๋Š” ์Šฌํ”„๋„๋ก ๋ณต์žกํ•œ ๋ฏธ๋‹ˆ์ธ„์–ด์ž…๋‹ˆ๋‹ค. - [Data Science at the Command Line](http://datascienceatthecommandline.com/#tools): ๊ฐ™์€ ์ด๋ฆ„์˜ ์ฑ…์—์„œ ๋‚˜์˜จ, ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค๋ฅผ ์œ„ํ•œ ๋” ๋‚˜์€ ๋ช…๋ น๊ณผ ๋„๊ตฌ๋“ค ์ž…๋‹ˆ๋‹ค. ## Disclaimer ๋งค์šฐ ์ž‘์€ ์ž‘์—…์„ ์ œ์™ธํ•œ ์ฝ”๋“œ๋“ค์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. ํฐ ํž˜์—๋Š” ์ฑ…์ž„์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. Bash์—์„œ ๋ญ”๊ฐ€๋ฅผ *ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”* ๊ฒƒ์€ Bash๋กœ ํ•ด์•ผ ๋œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค! ;) ## License [![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ์ด ์ €์ž‘๋ฌผ์€ [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/)์— ๋”ฐ๋ผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.