「入門者のLinux」第十三章
第十三章「応用!」
<コマンド>
[sed]...文字を置き換える
[tr A-Z a-z]...大文字、小文字の変換で使う
[sort]...辞書順に並べ替える
[uniq -c]...それぞれ数える
[sort -n -r]...出現回数多い順に並べる
[-n]...辞書順ではなく数字の小さい順に並べる
[-r]...順序をひっくり返す
[wget]...CUIでネット上のファイルをダウンロードする
[avconv]...動画を作成する
コマンドを定期的に実行する仕組みのことを「cron」という。
決められたコマンドを決められてたスケジュールでユーザーの代わりに自動的に実行してくれる仕組み。
UnixのCUIが有用なのは、「cron」による自動処理。
やるべきことがワンライナーやシェルスクリプトに整理されることは繰り返しや自動処理と相性が良い。
実践、実戦。
おもしろかったなぁ。
容量足りないっていわれてできないとこあったけど、、(笑)
あ~切実に時間が欲しいです。
「入門者のLinux」第十二章
第十二章「プロセスの管理と操作」
Linuxはたくさんの処理を同時に行っている。
その仕組みをマルチタスクという。
現在進行中の仕事を確認するには、
[ps au]
というコマンド。
そうすると、処理している仕事を1行に1つという単位で示す。
この個々の行で示されている仕事をプロセスという。
[sleep 10 &]
[sleep 10]
は10秒間待つコマンド。
[&]
はコマンドをシェル以外のところで走らせることができる。
これをバックグラウンドという。
バックグラウンドで走らせることで、そのシェルに他のコマンドが打つことが出来る。
バックグラウンドで走らせているコマンドを元の画面に戻したくなることがある。
その場合には「fg」というコマンドを打つ。
バックグラウンドの対義語はフォアグラウンド。
つまり、目の前のシェルの画面で実行することを指す。
フォアグラウンドで実行したあと、「ああ、バックグラウンドですればよかった!」って時がある。
そういう時はコマンドを実行したあと、
[CTRL]キー+[z]キー...一時停止
いったんコマンドを停止させてから
[bg]
を打って完了。
3つのコマンドがパイプでつながっているとき、
[コマンド1 | コマンド2 | コマンド3]
これら全体が1つのジョブとみなされる。
ジョブっていうのはまとめて実行されるプロセスの集まり。
つまり、これは3つのプロセスの集まりってこと。
Linuxは安定したOSですが、ときにフリーズすることもある。
強制終了したくなりますねぇ。
シェル上で動いているコマンドなら、[CTRL]+[c]で強制終了できることが多い。
しかしそれでも終わってくれないときがあるし、一見終わったように見えてもまだ動いているときがある。
そういう場合は「kill」コマンド!
「kill」コマンドはプロセスを直接的に強制終了してくれる。
「kill」コマンドを使う場合はプロセスIDが必要になるので、別のターミナルを立ち上げ「ps au」コマンドでプロセスIDを調べる。
[kill プロセスID]...強制終了
画面全体がフリーズして別のターミナルすら立ち上げることが出来ない場合の方法が2つある。
・[CTRL]+[Alt]+[F1]...GUIウィンドウ全体が停止する。
画面全体が1つのCUIのターミナルになる。
[CTRL]+[Alt]+[F7]で元のGUIに戻る。
・別のコンピュータからSSHというやり方でログインし「ps au」して「kill」する。
「kill」コマンドを使っても終了できないときは、「kill」コマンドに「-kill」というオプションをつける。
[kill -kill プロセスID]
「入門者のLinux」第十一章
第十一章「シェルをもっと知ろう」
<コマンドの実体>
シェル上で走るコマンドは多くの場合それぞれが独立したプログラム(ソフトウェア)。
1つのコマンドに対してディレクトリツリーのどこかにプログラムを格納した実行可能ファイルが1つ存在する。
コマンドの実体を調べるには、
[whici ls]...「ls」コマンドの実体はどこにあるのか
⇒[/bin/ls]
「/bin」というディレクトリの中に「ls」ファイルがあるとわかる。
「/bin/ls」ファイルのパーミッションを見てみると、
[-rwxr-xr-x]
こんな感じで出てくる。
所有者、グループ、その他ユーザーすべてに「x」パーミッションが与えられている。つまり、実行許可がでている。
パーミッションに実行許可が与えられているファイルを実行可能ファイルという。
つまり、「ls」コマンドを打つたびに「/bin/ls」という実行可能ファイルが実行されていたということ。
ほとんどのコマンドの実体は、「/bin」「/usr/bin」「/sbin」「/usr/sbin」のどれかの中にある。
「/bin」と「/sbin」は基本的なコマンドが入っている。
「/usr/bin」と「/usr/sbin」はシステム管理に関わるコマンドが入っている。
<シェルの実体>
シェルはLinux上の仕組みである。
それを動かしているプログラム(ソフトウェア、コマンド)があるはず。
それを探すには、
[echo &SHELL]...「SHELL」という名前のシェル変数の内容を表示
⇒[/bin/bash]
この実行可能ファイルが実際に使っているシェルの実体なのです。
「/bin/bash」は「bash(バッシュ)」という有名なシェルの一種。
その他のシェルだと、「zsh」や「tcsh」などがある。
シェルが違うとコマンドや機能がちょっと違うことがある。
そのため、ネットで調べたコマンドがうまく走らないとか、古めのUnixのテキストに書いてあることがうまく動かないみたいな問題の原因はシェルの違いであることが多いんだとか。
シェルで走るコマンドには2種類ある!
1つは前述したような、独立したコマンド。
もう1つはシェルの「組み込みコマンド」。
コマンドを走らせるためのコマンドが存在しない。
代わりに「bash」とかが自分の中にコマンドを持っている。
いわゆる、シェルの付属品。
「bash」の組み込みコマンドを見るには、
[help]
特殊なタイプのシェル変数がある。
例えば、シェルは様々な言語で提供できるようになっている。
それを担うのが環境変数といわれるもの。
環境変数にはシェル設定などに関する情報を格納している。
どのようなシェル変数があるかは、「set」コマンドで見れる。
[set | less]
「less」コマンドを終わらせるには「q」キー。
いくつかシェル変数紹介。
・COLUMNS...今開いてる端末の横幅
・HOME...ホームディレクトリの絶対パス
・LANG...どの言語を選択しているか
・PWD...カレントディレクトリの絶対パス
・SHELL...シェル実行のファイル
・USER...ユーザー名
このようなシェル変数や環境変数な内容を表示させるには「echo」コマンドを使用する。
中身を見るときは「$」を頭に付けて指定すること。
シェルはコマンドの実体が入っている可能性の高いディレクトリに関する情報をあらかじめ把握している。
実行可能ファイルをすぐ見つけ出せる裏にはそんな事情があったんですね。
そのような情報のことをコマンドサーチパスという。
コマンドサーチパスは「PATH」という環境変数に格納されている。
例えば、もし「PATH」が破壊(空白に)されても、実行可能ファイルの場所(パス)を明示的にシェルい教えるとコマンドは動く。
シェルの付属品組み込みコマンドはコマンドサーチパスとは無関係に動くので心配なし。
複数のコマンドをテキストファイルにまとめて実行することができる。
⇒複数のコマンドを順に組み合わせ、一連のまとまりのある処理として1つのプログラムのように仕立て上げることができる。
それをシェルスクリプトという。
「入門者のLinux」第十章
第十章「定番のテキストエディターvi」
Unix、Linuxでは情報はなるべくテキストファイル(文字の羅列)で管理している。
バイナリファイルは、情報を直接的に数値に対応させて表現されているもの。
それには読み解くのに特別なソフトウェアが必要。
それが面倒だからテキストファイル使おうって話。
故に、テキストファイルを手際よく扱うことが大事なんだな。
大きなテキストファイルから特定の情報を抽出したり整形したり定型化された処理を繰り返すにはワンラインーや「awk」が便利。
しかし、テキストファイルに中身を見ながら修正を加えたり、新たなテキストファイルをゼロから作ったりするときは、画面上のテキストをキーボードでいじれるソフトのほうが便利。
そういうソフトのことをテキストエディターという。
テキストエディターはちっちゃいワープロって感じらしい。
文書を「文字の集まり」として認識して、文字を消したり追加したりテキストファイルを編集できる。
Unix、Linuxの定番テキストエディターは「vi(ヴイアイ)」。
「vi」には昔からある使いにくい「vi」と、昔からあるやつを拡張して使いやすくした「vi」がある。
Ubuntu Linuxでは前者は「vim-tiny」、後者を「vim」とそれぞれ呼ぶ。
Ubuntu Linuxをインストール後は、「vi」は「vim-tiny」になってることが多いので「vim」をインストールする。
[sudo apt-get install vim]
[vi 編集したいファイル名]...「vi」の世界に入る=「vi」起動
「vi」を起動すると、まずコマンドモードに入る。
コマンドモードとは、テキストの一部を削除したりコピペしたりファイルを保存したり「vi」を終了したりするモードのこと。
コマンドモード以外に挿入モードがある。
挿入モードに入るには[i]キーをおす。
挿入モードはテキスト内容をキーボードで直接打ち込んだり書き換えたりする。
「vi」のコツ
・操作に行き詰まったら[Esc]キーをおしてコマンドモードに戻る。
・1文字削除は[x] 、1行削除は[dd]
・誤操作は[u]で元に戻せる。
・不要な部分を消し去ったら、書き換えたいところまでカーソルを移動し、[i]キーをおして挿入モードに入り挿入したい内容を打ち込む。
「入門者のLinux」第九章
第九章「awkを使ってみよう!」
「awk」はテキストデータを色々加工したり処理したりするコマンド。
それ自体がプログラミング言語としての機能を備えている。
[echo 100 200 | awk '{print $1}']
「awk」では、「`」バッククォートではなく、「'」シングルクォートを使う。
[print]...「awk」のコマンド、データを表示する。
[$1]...「awk」の標準入力に流れ込んでくるデータの中の左から1番目の項目
「awk」はデータの切れ目を空白文字やタブで勝手に判断する。
[echo 100 200 | awk '{print $1+$2}'] = 300
「awk」は計算できる。
「awk」にも変数がある。
[echo 100 200 | awk '{x=$1+$2; print x}'] = 300
いったん「x」という変数に「x=$1+$2」を保持し、そのあとprintコマンドで「x」の内容を表示する。
「awk」の中で複数のコマンドを順に実行するにはコマンド同士を「;(セミコロン)」で分かち書きする。
「|(パイプ)」はコマンドの標準出力を別のコマンドの標準入力に流しこむ。
「awk」は標準出力に流れ込んできたデータを処理する。
⇒どんなコマンドであろうが標準出力にテキストデータを吐き出すコマンドなら流し込める。
「awk」は流れてきたテキストデータをすべての行のそれぞれについて処理する。
⇒行ごとに処理を繰り返す。
またUnixには、データはテキスト文化で1行につき1件のデータを表現するという文化がある。
1から100までの整数を全部足したらどうなる?
[seq 1 100 | awk '{s=s+$1; print $1, s}']
[$1 ... 1から100まで順に入る]
[s=s+$1 ... 変数sに$1を足した結果をsを格納せよ]
[print $1, s ... $1とsを画面に出せ]
数学の等号とは違って、「=」は右辺の計算結果を左辺に代入せよって意味。
こうすることで、1から100までの整数を足した数が表示される。
カレンダー問題
前章でやった2015年から2024年までの各年での13日の金曜の求め方が、
[for y in `seq 2015 2024`; do for m in `seq 1 12`; do date -d $y/$m/13 +"%Y %a"; done | grep Fri; done | uniq -c]
う~ん長いねぇ(笑)
この中で、13日の金曜日が3日あった年は何回かを求めるには、
[for y in `seq 2015 2024`; do for m in `seq 1 12`; do date -d $y/$m/13 +"%Y %a"; done | grep Fri; done | uniq -c | awk '{$1==3{print}']
[$1==3] ... 1項目が3だったら表示=13日の金曜日が3日あった年を表示
例えば、4以上とかの時には、
[$1>3]
みたいになる。
こんな感じで「awk」は「{ }」の前に条件判定を置くことができる。
・「awk」は標準入出力で流れてくるデータを柔軟に選別、加工するのが得意。
・「awk」はUnixの標準入出力の中に手軽に埋め込める。
・「awk」はバグが出にくい。
難しくなってきましたな。
明日から学校お休みだぞーん。
お勉強するんだぞーん。
「入門者のLinux」第八章
第八章「ワンライナーでプログラミングしてみよう!」
プログラミングとは、コンピュータのシンプルな機能を組み合わせてユーザーの意図する仕事のできるプログラムを作り上げること。
普通、プログラミングというとJavaとかC言語とかプログラミング言語を使って作ることを想像しがち。
しかし一方で、シェル上で1行のコマンドとして走る小さなプログラムをワンライナーという。
ワンライナーはいくつかのコマンドをパイプなどでつなぎ作る。
<シェル変数>
変数とは、データを保存しておくための箱のようなもの。
方程式のxを思い出して!
例えば、「x」という変数に「3」を代入したければ、
[x=3]
「x」の中身を見るには、
[echo $x]
⇒シェル変数(x)の前に「$」をつけること!
つけることで、「そのシェル変数の中に入っている値」という意味になる。
シェル変数はコマンドの結果も代入することができる。
[d = `date`]
コマンドの場合は前後にバッククォート必要。
同じような処理を繰り返したいときには、「for ループ」を使う。
「for ループ」では、一つの変数に色々な値を代入しながらその都度
同じ処理を行う。
[for シェル変数 in シェル変数に入れる値を列挙; do 繰り返したいコマンド; done]
シェル変数に数値をいれるとき、1から100とかめっちゃ多いときは、
[seq 1 100]...1から100までの整数をずらっと並べる
でできる。
「for ループ」の値の範囲指定に使うときは、
[for a in `seq 1 100`; do echo $a; done]
みたいな感じで、バッククォートも忘れずにつける。
<おまけ>
環境変数っていうシェル変数「LANG」がある。
ターミナルの言語設定情報が入っている。
[LANG=C]...「LANG」に「C」を代入で使用言語が英語になる
[grep]...抜き出しコマンド
[uniq]...前後で同じ行が重複したら1つにまとめる
[ * ]...ワイルドカード=複数のファイルまとめる
ex) abc.jpg , def.jpg , ghi.jpg = *jpg
ワンライナーは使い捨て。
その場その場で必要なものを即興でつくり目的が達成できたら保存せずに捨てる。
ちょっと形式変えてみたぁ。
バッククォートのせい(笑)