Skip to content

Instantly share code, notes, and snippets.

@kinjo kinjo/study.md
Last active Aug 29, 2015

Embed
What would you like to do?

2015-08-21

  • Takumi KINJO
  • Unix コマンド基礎

対象者

  • インフラ屋さん(NW、サーバ、ストレージなど)
  • Unix 系 OS との対話がどんなものか少し知っている
  • 勉強して業務を効率化したい
  • プログラムは……また後で(まずはインフラ屋がやれる範囲から)
  • 端末が Mac OS X を想定

今回の位置付け

  • Unix 対話編
    • CUI に触れる <- イマココ
      • Bash, キーバインド、Git と GitHub
    • CUI に触れる 2
      • 出力とパイプ、Bash のロジック記述
    • ワンライナー sed/perl/python
    • 正規表現
    • Git と Subversion
    • エディタ(vi/emacs)
    • プロセス構造とパッケージ追跡
    • ed, ssh, expect, スクリプト化と実行手法

只今整理中(今後もっと増える)

目次

  • インフラ屋とプログラム屋の守備範囲
  • Git
    • Git と GitHub
    • GitHub からソースを取得してみる
  • Bash に触れてみる
    • CUI(Linux との対話)
    • 教えてくれないキーバインド
    • 今回のコマンド
    • パイプ

インフラ屋とプログラム屋の守備範囲

これまでは以下

  • if が出てくる → プログラム屋の範囲
  • if が出てこない → インフラ屋の範囲

これからは以下

  • プログラムを知らないインフラ屋は稼げない
  • インフラを知らないプログラム屋は稼げない

なぜか

  • インフラ資源をプログラム的に扱うサービスが出揃い済み
    • プログラムを知らないインフラ屋は稼げない
    • インフラを知らないプログラム屋は稼げない

Git ~ Git と GitHub

世間では Git/GitHub が流行り

  • 最新ソースコードに追従が必須なことが多々ある(OpenStack)
  • 最新ソースコードは Git(GitHub) で公開されていることが多い
  • 実際 Subversion より良い点が多数ある(また次回)

GitHub はフリープランから始められる Git リポジトリホスティングサービス

  • GitHub はソースコードホスティングとイマドキの SNS の特性を結びつけた
  • GitHub は OSS 開発フローを完成させたとも聞こえる

OOL のリポジトリを覗いてみる

GitHub からソースを取得してみる

https://github.com/opensourcerouting/quagga の最新ソースコードを取得してみる。

git コマンドがない → OSX では Xcode を入れる必要あり

git clone コマンドで取得する。 Git リポジトリの URL は https://github.com/opensourcerouting/quagga の HTTPS clone URL からコピー。

git clone https://github.com/opensourcerouting/quagga.git

Bash に触れてみる ~ CUI(Linux との対話)

CUI は、表示されたプロンプトにコマンド(プログラム)を入力することで計算機と対話する。

Bash は Linux や OS X にデフォで入っている対話プログラムのひとつ(シェルと呼ばれる)

OS X ではターミナルを起動すると、その中で Bash が起動されて対話が始まる。

シェルには系列がいくつかある

  • Linux は Bash がデフォと思うが Ubuntu の root はデフォルト Dash(Ash) だったはず
  • BSD 系のデフォルト Shell は Csh だったはず
  • Bash をパワーアップした Zsh というものもある

それぞれ使い勝手が微妙に違うし、スクリプト書くときにハマる要因になったりする。

Bash に触れてみる ~ 教えてくれないキーバインド

Bash ではデフォルトで Emacs 系キーバインドが使える。(vi 系キーバインドへの切り替えも可な模様)

  • C-f カーソルを右へ( CTRL 押下しながら f を押下)
  • C-b カーソルを左へ
  • C-e カーソルを右端へ
  • C-a カーソルを左端へ
  • M-f カーソルを 1 ワード右へ( ALT 押下しながら f 、または ESC 押下した後で f
  • M-b カーソルを 1 ワード左へ
  • C-k カーソル位置から右を削除(削除することを kill ともいう)
  • M-d 右方向の 1 ワードを削除
  • M-BS 左方向の 1 ワードを削除
  • C-y kill した文字列を貼り付け
  • C-p 過去に入力したコマンドを辿る
  • C-n 未来方向に入力したコマンドを辿る
  • M-< ヒストリに記録されている最古のコマンド
  • M-> ヒストリに記録されている最新のコマンド
  • C-r 過去に入力したコマンドを検索
  • M-u ワードの文字列を大文字にする
  • M-l ワードの文字列を小文字にする
  • M-c ワードの文字列の先頭だけを大文字にする
  • C-_ アンドゥ

他にもあると思う。

Bash に触れてみる ~ 今回のコマンド

大抵の Unix 系 OS で使える基礎コマンド

  • ls
  • head
  • tail
  • cat
  • grep
  • cut
  • sort | uniq
  • sed
  • locate , mdfind , find
  • xargs
  • while
  • read

それぞれのコマンドはシンプルな機能だけを提供する

Bash に触れてみる ~ パイプ

パイプ(|)=コマンドの出力を次のコマンドに食わせる

シンプルな機能を繋ぎあわせ、希望する出力を組み立てる

ls -lt でタイムスタンプが最近の順で出力させ head で先頭から 3 行目まで表示する

ls -lt | head -3

ls -lt の出力を tail で末尾から 3 行目までを表示する

ls -lt | tail -3

cat/etc/passwd の内容を出力させ、行頭が root で始まる行だけを表示する

cat /etc/passwd | grep ^root

cat/etc/passwd の内容を出力させ、ユーザとユーザのシェルだけを表示する

cat /etc/passwd | cut -d ':' -f 1,7

上記だと区切り文字がコロン(:)のため見にくいので、区切り文字をタブに置換する

cat /etc/passwd | cut -d ':' -f 1,7 | sed s/:/$'\t'/g

上記の出力をコピーして Excel にペーストしてみる。Excel の区切り文字はタブなので、しっかり貼り付けされる。

上記の出力に対し、シェルの種類で集計したい

cat /etc/passwd | cut -d ':' -f 7 | sort | uniq -c

上記だとコメントが集計の邪魔になるため、コメントが含まれる行を除外して集計する。

cat /etc/passwd | cut -d ':' -f 7 | grep -v '#' | sort | uniq -c

mdfind (Linux の場合は locate )で、拡張子が pdf のファイルを全て一覧で表示する

mdfind -onlyin ~ -name .pdf

find で拡張子が pdf のファイルを全て一覧で表示する

find ~ -name "*a.pdf"

違いは

  • mdfind インデックスをベースに検索=速いが細かな検索オプションを指定できない
  • find ディレクトリツリーを辿りながら検索=遅いが様々なオプションを指定できる

find でファイル一覧を出力させ、 xargs で一覧を grep の引数に食わせファイルの内容を検索する

find ~ -name "*.txt" | head -1000 | xargs grep OSPF

xargs を使うことの注意点

  • 次のコマンドに渡せる引数の個数には上限がある
  • 渡される入力文字列にスペースが含まれていると、区切り文字と認識される

OSS ソースコードファイル調査には find | xargs grep が強力だが、 ファイルサーバのような場所を検索する場合は、 ファイル名にスペースが入っていたり日本語だったりするため対策が必要。対策としては以下。

find でファイル一覧を出力させ、 while read i で一覧を読み込み grep でファイルの内容を検索する

find ~ -name "*.txt" | while read i; do grep -Hn OSPF "$i"; done

xargs より while read i のほうが確実だがおそい。

以上のようにコマンドを組み立てていく。

いつも実行するコマンドは自動、または手動で実行できるようスクリプト化する。

スクリプトの話は次回以降で。

以上。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.