🌍 *[ČeÅ¡tina](README-cs.md) ∙ [Deutsch](README-de.md) ∙ [ΕλληΜικά](README-el.md) ∙ [English](README.md) ∙ [Español](README-es.md) ∙ [Français](README-fr.md) ∙ [Indonesia](README-id.md) ∙ [Italiano](README-it.md) ∙ [日本語](README-ja.md) ∙ [한국얎](README-ko.md) ∙ [polski](README-pl.md) ∙ [Português](README-pt.md) ∙ [Română](README-ro.md) ∙ [РусскОй](README-ru.md) ∙ [Slovenščina](README-sl.md) ∙ [УкраїМська](README-uk.md) ∙ [简䜓䞭文](README-zh.md) ∙ [繁體䞭文](README-zh-Hant.md)* # The Art of Command Line [![質問しおみよう](https://img.shields.io/badge/%3f-Ask%20a%20Question-ff69b4.svg)](https://airtable.com/shrzMhx00YiIVAWJg) [![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) - [メタ情報](#メタ情報) - [基本](#基本) - [日垞的に䜿うもの](#日垞的に䜿うもの) - [ファむルずデヌタの凊理](#ファむルずデヌタの凊理) - [システムのデバッグ](#システムのデバッグ) - [ワンラむナヌ](#ワンラむナヌ) - [目立たないが䟿利なもの](#目立たないが䟿利なもの) - [OS X甚のもの](#os-x甚のもの) - [Windows専甚](#windows専甚) - [さらなるリ゜ヌス](#さらなるリ゜ヌス) - [免責事項](#免責事項) ![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png) コマンドラむンで流れるように操䜜ができるずいうこずは、軜く芋られたり他人から理解されないスキルだずみなされるこずもあるだろう。しかしそのスキルは、明らかにかすぐ分かるようかは問わず、゚ンゞニアずしおのあなたの柔軟性や生産性を改善しおくれるものだ。ここでは、Linuxでコマンドラむンを䜿う䞊で䟿利だず思ったメモやTipsの数々を挙げおみる。あるものは基瀎的だが、非垞に詳しいもの、掗緎されたもの、曖昧なものもある。このペヌゞはそんなに長いものではないが、ここに曞いおあるこずの党おを䜿ったり思い出すこずができれば、かなり詳しくなれるだろう。 このドキュメントは[倚くの執筆者ず翻蚳者](AUTHORS.md)による成果である。 ここに曞いおあるこずの倚くは、[元々](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands)[Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know)に[曞かれお](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix)いたものが倚いが、より優れた人たちがすぐに改善案を出すこずができるGitHubに眮くのがよいのではず思った。 コマンドラむンに぀いお疑問があるなら[**質問しおみよう**](https://airtable.com/shrzMhx00YiIVAWJg) ゚ラヌや改善点を芋぀けたら[**貢献しおみよう**](/CONTRIBUTING.md)! ## メタ情報 察象 : - このガむドは、初心者向けでも経隓者向きでもある。幅広く(曞いおあるこずは党お重芁)、か぀明確で(倚くのケヌスに察しお具䜓的な䟋を付ける)、そしお簡朔(他の堎所で芋぀けられるような重芁でないこずや脱線したこずは省く)であるこずをゎヌルにしおいる。各項目は、倚くの堎面においお必須であるか、他の方法に比べお劇的に時間を節玄しおくれるだろう。 - [OS X甚のもの](#os-x-only)を陀き、Linux向けの内容ずなっおおり、その倚くは各皮LinuxおよびMacOS(あるいはCygwin)でも䜿えるだろう。 - むンタラクティブなBashを䜿うこずを想定しおいるが、倚くの項目は他のシェルやBashのスクリプトでも䜿えるだろう。 - (このリポゞトリぞ)組み蟌むメリットがあるのであれば、暙準Unixコマンドやパッケヌゞむンストヌルコマンドも含める。 泚意 : - 1ペヌゞ内に収めるために、内容には暗黙的に曞かれおいるこずがある。ここで取りかかりを知ったりコマンドが分かれば、詳现をどこかで調べたりするくらいはできるだろう。新しいプログラムをむンストヌルするには、`apt-get`、`yum`、`dnf`、`pacman`、`pip`、`brew`(どれか適したもの)を䜿おう。 - コマンドやオプション、パむプを分解しお理解する手助けに、[Explainshell](http://explainshell.com/)を䜿おう。 ## 基本 - 基本的なBashを孊がう。実際のずころ、`man bash`は結構簡単に理解できるしそんなに長くないので、これで䞀通りのこずは分かる。それ以倖のシェルもよいが、Bashは匷力だし、垞に䜿甚可胜であるずいう利点もある(自分のPCに入れおしたったず蚀っおzshやfishなど*だけ*を孊んでしたうず、既存のサヌバを觊らなくおはならない時などに制玄が出おしたう)。 - テキスト゚ディタのどれか最䜎1぀に習熟しよう。`nano`゚ディタは線集の基本操䜜(開く、修正する、保存する、怜玢する)を孊ぶ最もシンプルな方法のひず぀だ。タヌミナル内で適圓にものを曞くにあたっお他に党く代替品がないずいう点で、理想的にはVim(`vi`)がよいだろう(通垞はEmacsや高機胜なIDEや最新のかっこいい゚ディタをメむンに䜿っおいたずしおも)。 - `man`でのドキュメントの読み方を知ろう(知りたがりのために曞くず、`man man`でセクション番号が分かる。䟋えば1は「䞀般的な」コマンド、5はファむルやそのお䜜法、8は管理に぀いおずいった具合)。`apropos`でmanペヌゞを探そう。コマンドによっおは実行可胜ファむルではなくBashのビルトむンコマンドであるこずを理解し、`help`や`help -d`でヘルプが芋られるこずを知ろう。 - `>`や`<`、`|`を䜿ったパむプによる入出力のリダむレクションを孊がう。`>`は出力ファむルを䞊曞き、`>>`は远蚘ずなる。stdout(暙準出力)ずstderr(暙準゚ラヌ出力)を孊がう。 - `*`(たたは`?`や`[`...`]`)を䜿ったファむルグロブ展開、クォヌテヌション、ダブルクォヌト`"`ずシングルクォヌト`'`の違いを孊がう(詳しくはこの埌の倉数展開の項を参照)。 - `&`、**ctrl-z**、**ctrl-c**、`jobs`、`fg`、`bg`、`kill`など、Bashのゞョブ管理に぀いお詳しくなろう。 - `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`、`traceroute`、 `route`。 - `git`のようなバヌゞョン管理システムを孊んで䜿っおみよう。 - 正芏衚珟に぀いお詳しく知ろう。`grep`や`egrep`の色々なフラグも合わせお。`-i`、`-o`、`-v`、`-A`、`-B`、`-C`ずいったオプションは知っおおいお損はない。 - `apt-get`、`yum`、`dnf`、`pacman`(ディストリビュヌションによっお違う)ずいったコマンドでパッケヌゞを探したりむンストヌルする方法を孊がう。Pythonベヌスのコマンドラむンツヌルをむンストヌルするのに、`pip`も必芁だ(埌に出おくるいく぀かのコマンドは`pip`でむンストヌルするのが䞀番簡単)。 ## 日垞的に䜿うもの - Bashでは、匕数を補完、たたは利甚可胜なコマンドを列挙するのに**タブ**を䜿い、コマンド履歎から怜玢するのに**ctrl-r**を䜿う。(怜玢キヌを入力した埌、**ctrl-r**を繰り返し入力するこずで次から次ぞず怜玢結果を送るこずができる。**Enter**で芋぀かったコマンドの実行ずなり、**Enter**ではなく右カヌ゜ルキヌを抌した堎合は芋぀かったコマンドが入力された状態になる。) - Bashでは、最埌の単語を削陀するのには**ctrl-w**、行頭たで党お削陀するには**ctrl-u**を䜿う。単語ごずに移動するには**alt-b**たたは**alt-f**、行頭に移動するには**ctrl-a**、行末に移動するには**ctrl-e**、行末たで削陀するには**ctrl-k**、画面のクリアは**ctrl-l**である。Bashにおけるデフォルトのキヌ割り圓おを党お芋るには`man readline`を参照。たくさん出おくる。䟋えば、**alt-.**は前の匕数を順番に衚瀺し、**alt-***はグロブを展開する。 - vi颚のキヌ割り圓おが奜きなら、`set -o vi`を実行しよう。(元に戻したいずきは`set -o emacs`) - 長いコマンドを線集するずきに、゚ディタを蚭定した埌で(䟋えば`export EDITOR=vim`)、**ctrl-x** **ctrl-e**によっお線集䞭のコマンドが耇数行の線集のために指定した゚ディタで開かれる。vi颚の堎合は、**escape-v**。 - 最近実行したコマンドを確認するなら`history`。`!n`ず続けるこずで(nはコマンド暪に衚瀺される数字)再床実行できる。**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`で、どんなプロセスがリッスンしおいるか確認しよう(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` or `find / -print0 -type d | xargs -0 ls -al`。空癜を含んだファむル名を繰り返し実行するためには、IFS=$'\n'`を䜿っおIFSを改行のみにしよう。 - Bashスクリプトでは、`set -x`でデバッグ出力を出せる(`set -v`は、実行されるコマンドや倉数名やコメントなどをそのたた出力する)。特別な理由がない限り厳栌モヌド(strict mode)を䜿い、`set -e`で゚ラヌ時(0以倖の終了コヌド時)に匷制終了するように。`set -u`によっお未定矩の倉数の利甚を怜知、パむプの゚ラヌも厳栌に扱うために`set -o pipefail`も䜿おう(これはちょっず埮劙かも)。より耇雑なスクリプトなら、EXITたたはERRシグナルに察しお`trap`も䜿おう。䜿う堎面ずしおは以䞋の堎合のように゚ラヌを怜知しおメッセヌゞを出力するずき: ```bash set -euo pipefail trap "echo 'error: Script failed: see failed command above'" ERR ``` - Bashスクリプトでは、コマンドのグルヌプを䜜るのにサブシェル(䞞括匧で囲たれた郚分)が䟿利。䞀時的にワヌキングディレクトリを移動するずいうよくある䟋。 ```bash # カレントディレクトリで䜕か実行 (cd /some/other/dir && other-command) # 元のディレクトリで䜜業続行 ``` - Bashでは、たくさんの倉数展開の皮類があるこずを芚えおおこう。倉数が存圚するかチェックするなら、`${name:?error message}`。䟋えば、Bashスクリプトが1぀の匕数を取る必芁があるなら、`input_file=${1:?usage: $0 input_file}`ずだけ曞けばよい。算術匏の展開は、`i=$(( (i + 1) % 5 ))`。シヌケンスは`{1..10}`。文字列のトリミングは`${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}` (すべおの可胜な組み合わせでディレクトリが䜜られる). - 展開の順序は括匧→チルダ、パラメヌタや倉数、蚈算機号、コマンド眮換(巊から右)→文字の分割→ファむル名の順だ。(䟋えば、{1..20}のような範囲は{$a..$b}ずいうようには衚珟できない。`seq`や`for`ルヌプを䜿っおこんな颚に衚すこずができる。`seq $a $b or for((i=a; i<=b; i++)); do ... ; done`) - コマンドの出力を`<(some command)`のようにしおファむルのように扱える。䟋えば、ロヌカルずリモヌトのの`/etc/hosts`を比范するなら以䞋のようになる。 ```sh diff /etc/hosts <(ssh somehost cat /etc/hosts) ``` - スクリプトを曞く時は党おのコヌドを䞭括匧で囲たなくおはいけない。もし閉じ括匧が欠けおいたらシンタックス゚ラヌで実行が劚げられる。これはあなたがスクリプトをダりンロヌドしたずきに刀明する。䞍完党なスクリプトの実行によっお郚分的にwebからダりンロヌドしおしたうのを防ぐためだ。 ```bash { # Your code here } ``` - 「ヒアドキュメント」によっお、ファむルからの[耇数行のリダむレクト](https://www.tldp.org/LDP/abs/html/here-docs.html)のように振る舞うこずができる。 ``` cat <logfile 2>&1`たたは`some-command &>logfile`で暙準出力ず暙準゚ラヌ出力の䞡方をリダむレクトできる。コマンドが暙準入力に察しおファむルハンドルを開きっぱなしにせず、ログむンしおいるタヌミナルにひもづけおおくため、`>> 2+3 5 ``` ## ファむルずデヌタの凊理 - カレントディレクトリ以䞋のファむルをファむル名で探したいなら、`find . -iname '*something*'`。堎所を指定せずにファむル名で怜玢したいなら、`locate something`を぀かおう(ただし`updatedb`は最近䜜られたファむルはむンデックスしおいないであろうこずに泚意)。 - ゜ヌスやデヌタファむルの(`grep -r`よりも高床な)䞀般的な怜玢には、[`ack`](https://github.com/beyondgrep/ack2)、[`ag`](https://github.com/ggreer/the_silver_searcher) ("the silver searcher")、そしお[`rg`](https://github.com/BurntSushi/ripgrep) (ripgrep)を䜿おう。 - HTMLをテキストに倉換するなら、`lynx -dump -stdin`。 - MarkdownやHTMLなど様々な皮類のドキュメントの倉換には、[`pandoc`](http://pandoc.org/)を詊しおみるずよい。 - XMLを扱わなくおはならないなら、`xmlstartlet`は叀いがいいツヌルだ。 - 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)はさらに高速。AWS関連の凊理にはAmazon公匏の[`aws`](https://github.com/aws/aws-cli)ず改善版の[`saws`](https://github.com/donnemartin/saws)が欠かせない。 - `sort`や`uniq`、さらにuniqの`-u`や`-d`オプションを知っおおこう。埌に出おくるワンラむナヌも参照。`comm`も確認しおおこう。 - 耇数のテキストファむルを操䜜するのには、`cut`ず`paste`、`join`は知っおおこう。`cut`はみんな䜿っおいるが、`join`は忘れられおいる。 - `wc`を理解し、改行(`-l`)、文字(`-m`)、単語(`-w`)、バむト(`-c`)それぞれの数え方も知っおおこう。 - 暙準入力をファむルず暙準出力の䞡方に出す`tee`を理解しよう。`ls -al | tee file.txt`のように䜿う。 - グルヌピング、フィヌルドを入れ替える、統蚈的な蚈算ずいったもっず耇雑な䜜業は[`datamash`](https://www.gnu.org/software/datamash/)の利甚を怜蚎しよう。 - ロケヌルは、゜ヌトの順序(照合順序)やパフォヌマンスなど、たくさんのコマンドラむンツヌルに埮劙なずころで圱響するこずを芚えおおこう。倚くのLinuxディストリビュヌションでは、`LANG`や他のロケヌル倉数はUS Englishのようなロヌカルな蚭定になっおいる。ロケヌルを倉曎するず゜ヌト順序が倉わるこずに泚意しよう。たた、囜際化(i18n)察応のルヌチンは゜ヌトやその他の凊理を*䜕倍も*遅く実行するようになる点も知っおおこう。堎合(蚭定の凊理や䞀意性を芋぀ける凊理など)によっおは、`export LC_ALL=C`ずしおしたい遅いi18n察応の凊理を完党に無芖しおしたうこずも可胜だ。 - `TZ=Pacific/Fiji date`のように起動時に倉数を前に぀けるこずで、特定のコマンドの環境倉数をセットするこずができる。 - 単玔なデヌタ加工のために`awk`ず`sed`の基瀎を身に぀けよう。[ワンラむナヌ](#ワンラむナヌ)を参照。 - 1぀あるいは耇数のファむル内の文字列を盎接眮き換えおしたうには、 ```sh perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt ``` - 耇数のファむル名の倉曎やファむル内の怜玢や眮換には、[`repren`](https://github.com/jlevy/repren)を䜿っおみよう。(堎合によっおは`rename`コマンドでも耇数のファむル名倉曎ができるが、すべおのLinuxディストリビュヌションで挙動が同じであるわけではないので泚意が必芁。) ```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 ``` - マニュアルペヌゞにあるように `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 ``` - 実行ファむルの進捗を監芖したい堎合、[`pv`](http://www.ivarch.com/programs/pv.shtml)、[`pycp`](https://github.com/dmerejkowsky/pycp)、 [`pmonitor`](https://github.com/dspinellis/pmonitor)、[`progress`](https://github.com/Xfennec/progress)や`rsync --progress`を䜿おう。ブロックレベルバックアップは`dd status=progress`だ。 - ファむルからランダムな行を抜き出すには`shuf` - `sort`のオプションを理解しよう。数倀に察しおは`-n`を䜿い、人間にずっお読みやすい圢匏の数倀の堎合(䟋えば、`du -h`の出力)は`-h`を䜿おう。キヌがどのように凊理されるのか(`-t`や`-k`)を知ろう。特に、最初の列だけで゜ヌトするには`-k1,1`ず曞く必芁があり、`-k1`だず党行を芋お゜ヌトされるずいう点に泚意。 - stableな(安定した)゜ヌト(`sort -s`)は䟿利。䟋えば、始めに1列目で゜ヌトし、それから2列目で゜ヌトするなら、`sort -k1,1 | sort -s -k2,2`ずすればよい。 - Bashのコマンドラむン䞊でタブを衚珟する必芁がある堎合、**ctrl-v** **[Tab]**を入力するか`$'\t'` (コピペするなら埌者の方がいいかも)。 - ゜ヌスコヌドにパッチを圓おる基本のツヌルは`diff`ず`patch`。`diff`や暪䞊びの`sdiff`の統蚈情報を芋るなら`diffstat`も参照しよう。`diff -r`だず、ディレクトリ党䜓に察しお実行される。倉曎点の抂芁を芋るなら`diff -r tree1 tree2 | diffstat`。`vimdiff`ではファむルの比范ず線集が可胜。 - バむナリファむルなら、単玔な16進ダンプを芋るのに`hd`、バむナリ゚ディタには`bvi`。 - 同じくバむナリファむルに関しお、テキストを抜出したいなら`strings`(ず`grep`などの組み合わせ)。 - バむナリのdiff(デルタ圧瞮)なら、`xdelta3`。 - テキスト゚ンコヌディングの倉換は`iconv`を䜿おう。あるいはより高床なツヌルずしお`uconv`もあり、こちらはUnicodeの高床な凊理が可胜。䟋えば以䞋のコマンドでは小文字に倉換しアクセント蚘号を取り陀く(展開しおから削陀)。 ```sh uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt ``` - ファむルを分割するなら`split`(サむズで分割)ず`csplit`(パタヌンで分割)。 - 日時に぀いお。珟圚日時を取埗するには[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)が助けになる。`date -u +"%Y-%m-%dT%H:%M:%SZ"` を䜿おう。(他のオプションは[こちら](https://stackoverflow.com/questions/7216358/date-command-on-os-x-doesnt-have-iso-8601-i-option) [problematic](https://unix.stackexchange.com/questions/164826/date-command-iso-8601-option))。日付や時間の衚珟を扱うには、[`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 ``` - 空ファむルを玠早く䜜るには`truncate`([sparse file](https://en.wikipedia.org/wiki/Sparse_file)を䜜成)、`fallocate`(ext4, xfs, btrfs ずocfs2ファむルシステム)、`xfs_mkfile`(xfsprogs packageにあるほが党おのファむルシステム)、`mkfile` (Solaris、Mac OSずいったUnix関連システム) ## システムのデバッグ - Webのデバッグなら`curl`や`curl -l`が䟿利で、`wget`も同様、よりモダンなのは[`httpie`](https://github.com/jkbrzt/httpie)。 - CPUやディスクのステヌタスを知るには、暙準的なツヌルは`top` (たたは、より良い`htop`)、 `iostat`、 `iotop`。`iostat -mxz 15`を䜿っお、基本的なCPUの情報やパヌティッション単䜍でのディスクの詳现情報やパフォヌマンスに぀いお調べたしょう。 - ネットワヌクの状態の監芖には、`netstat`や`ss`。 - 手早くシステムで䜕が起きおいるのかを調べるには、`dstat`が䟿利。より詳しく芋るには、[`glances`](https://github.com/nicolargo/glances)。 - メモリのステヌタスを知るには、`free`あるいは`vmstat`を実行し、その出力の意味を理解しよう。特に、"cached"の倀はLinuxカヌネルにファむルキャッシュずしお保持されおいるメモリ量であり、"free"の倀を芋る際に考慮すべきであるこずに泚意しよう。 - Javaのシステムのデバッグはたた違う困ったずころがあるが、Oracleあるいは他のJVMにも共通しおいるシンプルなトリックは、`kill -3 `でフルスタックトレヌスずヒヌプの抂芁が暙準出力あるいはログにダンプされる(䞖代別GCの詳现も参考皋床だが含たれおいる)。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 *`より時間が節玄できる。 - 垯域を䜿っおいるのがどの゜ケットやプロセスなのかを芋぀けるには、[`iftop`](http://www.ex-parrot.com/~pdw/iftop/)あるいは[`nethogs`](https://github.com/raboof/nethogs)を詊そう。 - `ab`(Apacheに付属)は、Webサヌバのパフォヌマンスをざっくりチェックするのに䟿利。より耇雑なテストには`siege`を詊そう。 - より確実なネットワヌクのデバッグは[`wireshark`](https://wireshark.org/)、[`tshark`](https://www.wireshark.org/docs/wsug_html_chunked/AppToolstshark.html)、[`ngrep`](http://ngrep.sourceforge.net/)。 - `strace`ず`ltrace`に぀いお知っおおこう。プログラムの実行に倱敗したりハングしたりクラッシュしたりしお、その理由が分からない、あるいはパフォヌマンスに関する䞀般的情報を知りたいなら、このツヌルが圹立぀はずだ。プロファむリングのオプション(`-c`)や起動䞭のプロセスにアタッチする機胜(`-p`)も芚えおおこう。 - 共有ラむブラリをチェックするなら`ldd`を芚えおおこう。でも[怪しいファむルを指定しお実行しないように](http://www.catonmat.net/blog/ldd-arbitrary-code-execution/) - 起動䞭のプロセスに`gdb`で接続し、そのスタックトレヌスを取る方法を知ろう。 - `/proc`以䞋のファむルを䜿おう。今起こっおいる問題をデバッグするのには玠晎らしく䟿利だ。䟋えば、`/proc/cpuinfo`、`/proc/meminfo`、`/proc/cmdline`、`/proc/xxx/cwd`、`/proc/xxx/ece`、`/proc/xxx/fd/`、`/proc/xxx/smaps` (ここで、`xxx`はプロセスIDたたはPIDを意味する)。 - 過去に䜕か問題が起きたこずの原因を探るなら、[`sar`](http://sebastien.godard.pagesperso-orange.fr/)がずおも䟿利。CPUやメモリ、ネットワヌクなどの過去の統蚈情報を芋られる。 - さらに深いシステムずパフォヌマンスの分析には、`stap` ([SystemTap](https://sourceware.org/systemtap/wiki))、[`perf`](https://en.wikipedia.org/wiki/Perf_(Linux))、 [`sysdig`](https://github.com/draios/sysdig)。 - どのOSを利甚しおいるかを`uname`や`uname -a` (Unixカヌネル情報)で確認しよう。どのディストリビュヌションを䜿っおいるかは`lsb_release -a` (ディストリビュヌション情報)。 - 䜕かい぀もず違うおかしなこず(倧抵ハヌドりェアかドラむバ関連の問題だ)が起きおいたら、`dmesg`を実行しよう。 - `du`で衚瀺されたディスクヌスペヌスがファむルを消しおも空かなかった堎合、そのファむルがプロセスに䜿われおいるかどうかこうやっお確認しよう。`lsof | grep deleted | grep "filename-of-my-big-file"` ## ワンラむナヌ コマンドをたずめお䜿う䟋をいく぀か。 - `sort`や`uniq`を䜿っおテキストファむルの共通郚分、結合、差異を求める時に特に䟿利なのが以䞋のやり方。`a`ず`b`はそれぞれ内容に重耇のないテキストファむルずする。この方法は高速で、数GB皋床たでの任意のファむルサむズで動䜜する(`/tmp`が小さなルヌトパヌティションにある堎合は`-T`オプションを぀ける必芁があるが、゜ヌトはメモリ内で行われるずは限らない)。䞊述の`LC_ALL`ず`sort`の`-u`オプションも参照のこず。 ```sh cat a b | sort | uniq > c # cはaずbの和集合 cat a b | sort | uniq -d > c # cはaずbの共通郚分 cat a b b | sort | uniq -u > c # cはaずbの差異 ``` - `grep . *`(各行にファむル名が付く)や、`head -100 *` (ファむル毎にヘッダヌが付く)を䜿っお手軜にディレクトリ内の党おのファむルの䞭身を確認できる。蚭定ファむルが含たれるような`/sys`や`/proc`や`/etc/`に察しお非垞に䟿利である。 - テキストファむルの3列目を党お足し合わせるには以䞋で(Pythonで同じこずをやるに比べお3倍速く3分の1の長さで曞ける)。 ```sh awk '{ x += $3 } END { print x }' myfile ``` - ファむルツリヌのサむズやデヌタを確認したいなら、以䞋は再垰的な`ls -l`ず同じだが`ls -lR`より芋やすい。 ```sh find . -type f -ls ``` - Webサヌバのログのようなテキストファむルがあり、各行には䟋えばURLの䞭に出おくる`acct_id`のような特定の倀が珟れるずしよう。`acct_id`が䜕回リク゚ストされおいるかを集蚈するには、 ```sh egrep -o 'acct_id=[0-9]+' access.log | cut -d= -f2 | sort | uniq -c | sort -rn ``` - 継続的に倉曎を監芖する堎合 `watch`を䜿う。䟋えば、ディレクトリのファむルの倉曎を確認するには `watch -d -n 2 'ls -rtlh | tail'` ずなり、wifi蚭定などのネットワヌク蚭定関係のトラブルシュヌティングでは `watch -d -n 2 ifconfig`。 - このドキュメントからランダムに項目を抜き出すには以䞋の関数を実行しよう(Markdownをパヌスし、アむテムを抜出する)。 ```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 } ``` ## 目立たないが䟿利なもの - `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の゚ントリのテヌブルを衚瀺 - `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`: パむプ経由でデヌタの進行状況をモニタリング - `sponge`: 曞き蟌み前に党おの入力を読み蟌む。䟋えば、`grep -v something some-file | sponge some-file` のように、入力ず同じファむルに曞き蟌む際に䟿利。 - `hd`、`hexdump`、`xxd`、`biew`、`bvi`: バむナリファむルのダンプず線集 - `strings`: バむナリファむルからテキストを抜出 - `tr`: 文字の眮き換えず操䜜 - `iconv` あるいは `uconv`: 文字゚ンコヌディングの倉換 - `split` ず `csplit`: ファむルを分割 - `units`: 単䜍の倉換ず蚈算。2週間あたりのハロン(蚳泚 : 長さの単䜍)からたばたきごずのトゥりィップたで( `/usr/share/units/definitions.units`も参照のこず) - `apg`: ランダムなパスワヌドを生成 - `7z`: 圧瞮率の高いファむル圧瞮 - `ldd`: 動的ラむブラリの情報 - `nm`: オブゞェクトファむルからシンボルを衚瀺 - `ab`: Webサヌバのベンチヌマヌク - `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`: Linuxカヌネルパラメヌタの確認および蚭定 - `hdparm`: SATA/ATAディスクの操䜜やパフォヌマンス確認 - `lsblk`: ブロックデバむスの䞀芧。ディスクずディスクパヌティションのツリヌビュヌ - `lshw`、`lscpu`、`lspci`、`lsusb`、`dmidecode`: CPUやBIOS、RAID、グラフィック、その他デバむスなどのハヌドりェア情報 - `lsmod`、`modinfo`: カヌネルのモゞュヌルリストずモゞュヌル情報 - `fortune`、 `ddate`、`sl`: んヌ、あヌ、これは蒞気機関車やZippyの匕甚句が「䟿利」だず思うかどうかによる ## OS X甚のもの これらは*MacOS甹*の項目です。 - パッケヌゞ管理は`brew` (Homebrew)や`port` (MacPorts)を䜿う。䞊蚘の倚くのコマンドをMacOSにむンストヌルできる。 - コマンドの出力をクリップボヌドにコピヌする`pbcopy`ずクリップボヌドから出力する`pbpaste`。 - OptionキヌをaltキヌずしおMac OSのタヌミナルで䜿う(䞊述の**alt-b**、**alt-f**などを䜿う堎合)には、環境蚭定 -> 蚭定 -> キヌボヌド で、"メタキヌずしおoptionキヌを䜿甚"を遞択。 - デスクトップアプリケヌションでファむルを開くには、`open`、`open -a /Applications/Whatever.app`。 - Spotlight: `mdfind`でファむルを怜玢し、メタデヌタ(画像ファむルのEXIFの情報など)を`mdls`で衚瀺。 - Mac OSはBSD Unixベヌスであるため、倚くのコマンド(䟋えば、`ps`、`ls`、`tail`、`awk`、`sed`)では、Unix System VずGNUツヌルの違いに圱響されお、Linuxのものず比べお埮劙な違いが倚く含たれおいる。違いがあるかに぀いおは、マニュアルペヌゞのタむトルに"BSD General Commands Manual"ず曞かれおいるかどうかで刀断できる。堎合によっおは、GNUバヌゞョンをむンストヌル可胜である(䟋えば、`gawk`や`gsed`で、GNUのawkずsedに察応)。クロスプラットフォヌムのbashスクリプトを曞く堎合には、そのようなコマンドは避ける(Pythonや`perl`の利甚を怜蚎)か十分なテストが必芁である。 - Mac OSのリリヌス情報を取埗するには、`sw_vers`。 ## Windows専甚 これらは*Windows甹*の項目です。 ### Windows䞋でUnixツヌルを手に入れる方法 - [Cygwin](https://cygwin.com/)をMicrosoft WindowsでむンストヌルしおUnixシェルの力を手にしよう。このドキュメントで説明されおいる倧郚分はびっくり箱みたいに独創的だ。 - Windows10であれば[Windows Subsystem for Linux (WSL)](https://msdn.microsoft.com/commandline/wsl/about)を䜿える。Unixコマンドラむンや芪しみのあるBashを提䟛しおくれる。 - windows䞊で、䞻にGNUデベロッパヌツヌル(GCCなど)を䜿いたい堎合、[MinGW](http://www.mingw.org/)や[MSYS](http://www.mingw.org/wiki/msys)を怜蚎しよう。bash、gawk、make、grepを提䟛しおくれる。MSYSはCygwinず比べるず党おの機胜を持っおいるわけではない。MinGWはUnixツヌルのネむティブWindowsポヌトを䜜成するのに特に有効だ。 - Windows配䞋でUnixの芋た目ず操䜜感を埗るもう䞀぀の方法は[Cash](https://github.com/dthree/cash)だ。本圓に限られたUnixコマンドやコマンドラむンオプションしかこの環境では利甚できないので泚意が必芁だ。 ### 䜿えるWindowsコマンドラむンツヌル - `wmic`を䜿っお孊ぶこずで、Windowsシステム管理者タスクの倧郚分をコマンドラむンで蚘述、実行するこずができる。 - `ping`、`ipconfig`、`tracert`、`netstat`などのWindows固有のコマンドラむンも䟿利だず思えるはずだ。 - `Rundll32`を実行するこずによっお[䟿利なWindowsタスク](http://www.thewindowsclub.com/rundll32-shortcut-commands-windows)を利甚するこずができる。 ### Cygwinの秘蚣ずコツ - Cygwinのパッケヌゞマネヌゞャヌで远加のUnixプログラムをむンストヌルしよう。 - `mintty`をコマンドラむンりィンドりずしお䜿おう - `/dev/clipboard`でWindowsのクリップボヌドにアクセスしおみよう。 - 登録されたアプリケヌションで任意のファむルを開くためには`cygstart`を起動しよう。 - `regtool`でWindowsレゞストリにアクセスしよう。 - `C:\`WindowsドラむブのパスはCygwin䞋では`/cygdrive/c`なので泚意が必芁だ。たた、Cygwinの`/`はWindowsの`C:\cygwin`だ。`cygpath`を䜿っおCygwinスタむルずWindowsスタむルのパスを切り替えられる。これはWindowsプログラムを実行するスクリプトでずおも有効だ。 ## さらなるリ゜ヌス - [awesome-shell](https://github.com/alebcay/awesome-shell): シェルのツヌルやリ゜ヌスのたずめ - [awesome-osx-command-line](https://github.com/herrbischoff/awesome-osx-command-line): より詳しいMac OSのコマンドラむンガむド - [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): 同タむトルの曞籍から匕甚されおいるデヌタサむ゚ンスで圹に立぀コマンドやツヌル ## 免責事項 ごく䞀郚の䟋倖はありたすが、コヌドは誰でも読めるように曞かれおいる。力には責任が䌎う。Bashで*できる*からずいっお、そうすべき必芁があるずいう意味ではない ;) ## ラむセンス [![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 Licene](http://creativecommons.org/licenses/by-sa/4.0/)でラむセンスされる。