技術

UNIX/LINUXコマンドを語る回

開発のオジサンエンジニアDJです。

今回の記事ではUNIX/LINUXのコマンドについて語ります。好きなコマンドを切りのいい数字で10個ピックアップします。それに関連したものも挙げておきます。

基本コマンド

まずは日常的に使うコマンドの紹介から進めます。

pwd…print working directryの略。カレントディレクトリ(現在いる場所)を表示します。

mkdir/rmdir…make directory/remove directoryの略。空のディレクトリを作成/削除します。セットにしたくて一緒に2個挙げました。

cd…change directoryの略。カレントディレクトリを移動します。このコマンドはシェルの組み込みコマンドです。ちなみにUNIXのコマンドではなくシェルのコマンド。

history…そのまんまヒストリーです。実行したコマンドの履歴を見たいときに使用します。番号とコマンドが確認できますので、「!(番号)」でその番号に対応するコマンドを実行できます。タイプする量を減らせるのでhistory+!(番号)は結構使えます。これもUNIXのコマンドではなくシェルのコマンド。

ls…listの略。ファイル/ディレクトリを表示します。

cp…copyの略。ファイル/ディレクトリをコピーします。

mv…moveの略。ファイル/ディレクトリを移動します。

rm…removeの略。ファイル/ディレクトリを削除します。

cat…concatenateの略。ファイルの中身を表示します。連結機能もあったり、使い方を覚えると使用頻度が上がります。

more/less…ファイルの中身を表示する点はcatと似てますが、こちらはページャー機能があります。オジサンは「more」の方が体に染みついていますね。「git bash」を使ったときにmoreを使いエラーが返ってきて「あ、lessだった…」というのが今でもあり、都度都度エラーで気づく感じです。

vi…ファイルを開いて編集します。奥が深いのでここでは説明しません。『vi入門 by リンダ ラム (著), Linda Lamb (原著), 福崎 俊博 (翻訳) アスキー』にものすごく詳しく説明されています。正規表現についても詳しく書かれています。技術書としてだけでなく読み物としても面白いので今でも病院の待合室で読んだりします。

お気に入りコマンド10選

1.find

「 ○ ○ (12345)なんちゃら…」という名前のファイルはどこのディレクトリにあるんだろう?というときに使用します。使い方は

$ find . -name ‘12345*’ -print

です。便利…、というより使えないと仕事が進まない(出来ない)という事になってしまうので覚えておいてください。

2.grep

パターンマッチング。viなどで使われているg/re/pが語源。「✖✖(67890) 」という文字列を含んだファイルはどこにあるのかな?というときに使用します。使い方は

$ grep -irn ‘67890’ .

です。findと同様の重要性があります。セットで覚えて使いましょう。

3.sort

並び替えをします。支給されたデータの並び順がバラバラなときにこれを使って整形したりします。

4.uniq

重複業の削除。sort -uを使えば使う必要は無さそうですが、uniq -cはカウント機能があるのでsortと組み合わせて使います。SQLのdistinctなのかgroup byを使って重複業を消すかの感覚に近いですね、個人的には。

5.awk

テキスト処理言語。awkって何の略?かというと、開発者3人の頭文字です。読み方は『オーク』です。使い方はというと『sed & awkプログラミング 改訂版 by Dale Dougherty (著), Arnold Robbins (著), 福崎 俊博 (翻訳) オライリー・ジャパン』という書籍にものすごく詳しく書いてあります。技術書としてだけでなく、初心者が陥りやすい点なども書かれていて読み物としても面白いです。価格が張るのが難点ですが、技術者であればマスターすることで十分に元を取ることは可能です。書籍中に書かれている名言「awkの使い方をマスターすることによりawkにやらせる仕事が増える」は私の心の中に一番残っています。

3,4のsort,uniqへ渡す前のフィルターとして大活躍しております。基本で気な使い方としては

$ ll | awk ‘{$3 ~ /^hage$/{print $9}}’

です。動作はファイルの所有者が「hage」なら「ファイル名」を表示する。

6.head/tail

すみません、セットで使う頻度が高いので2ついっぺんに挙げます。catではファイルの101行目から200行目までを表示したいというのに(意外と)対応できないので、この2を使います。その使い方は

$ cat -n hogo.txt | head -200 | tail -100

です。1.頭の200行をフィルターとしてパイプでつなぐ、2.末尾の100行をフィルターとして使う。こんな感じです。

あとはリアルタイムでファイルに追記される様を確認するときには

$ tail -f hane.txt

画面がパラパラと流れるのでカッコイイです。アクセスログを閲覧するときにはよく使いますね。

7.su/whoami/who am i

switch userの頭文字。別のユーザーに成りすますときには「su」を使います。ただ、suを使ったのか使ってないのか今、誰のセッションかわからないときには「whoami(スペースなし)」「who am i(スペースあり)」を使います。

8.who/users

7の「whoami」と混同しそうですが、こちらはログイン中のユーザーを表示します。「あれ?やけに動作が遅いなぁ…」というときに実行すると、誰かがログインしていたりするのを確認できます。

9.ps

こちらはプロセス確認用のコマンド。8の「who」はログインしている場合には気づけるのですが、リモートシェルで実行しているときにはログインユーザーを調べても出てきませんが、psでプロセスを確認するとリモートシェルで実行依頼が来ていたりします。

10.echo

え?ここに来て「echo」??と思わるかもしれませんが、何気に便利なのはシェルスクリプトを書くとき、ログを残すために結構使います。実行完了するまで何も無しでは、どこまで進んでいるのか確認できないので結構ストレスです。webのプログラムでもデバッグ用途としてecho/printを使うのと同じです。

対話シェルではあまり使うことはありませんね。実行結果の末尾にLFが無い時に、強制的に改行させるようechoを付けたりしますね。

/bin/echoはUNIXのコマンドですが、単なるechoはシェルのコマンドで/bin/echoより実行速度は速いです。

その他の有用性が高いコマンド(次点)

sleep…まさに眠らせるコマンド。帰りがけに深夜スタートでスクリプトを走らせたい。手軽に…。そんなときには『date;sleep 60;date;』がサンプルです。dateを実行して、1分経ったらdateを実行する。

at…指定時刻に実行させるためのコマンド、手軽さではsleepですが、きっちり何時何分何秒に実行開始したいときにはatを使います。

tr…transrateの略。改行の無い長いファイルで「*」を改行に変換したいときなどに使います。

fold…まさに折り畳み。行を○○行で折りたたみたいときに使います。『fold -80 hane.txt』で80カラムで折り返し表示されます。

宿題・課題

宿題としてですが、シェルの問題です。

$ alias ll

alias ll='ls -l --color=auto'

$ ll

(実行結果は省略)

$ a=ll

$ $a

bash: ll: command not found

「ll」というコマンドが見つからない??コマンドラインから直にllを入れると実行できるのにシェル変数に入れた場合はエラー?何故でしょうか?

最後に

UNIXコマンドシェルコマンドの違いについて書いてきませんでしたが、違いはシェル自信で実行しているのがシェルコマンド、シェル自信で実行せずUNIXのプログラムを呼び出して実行しているのがUNIXのコマンドです。先ほど気づいたのですが、「git bash」で実行するとき、ls→ls.exe、mv→mv.exe、cp→cp.exe、rm→rm.exe、cd→cd、history→history、とUNIXのコマンドには.exeがあるのに対して、シェルのコマンドには.exeが付きません。

こうして振り返ってみるとテキスト処理系のコマンド、フィルターが多いですね。リダイレクト、並列実行などシェルの技術書も読むことでマスターしてないと手作業でちまちま進めていく選択肢しかない所が、unix/LINUXにやらせたい仕事が増えたりします。

次回はJQueryについて語ろうかと思います。

文:開発部DJ