「入門者の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
ワンライナーは使い捨て。
その場その場で必要なものを即興でつくり目的が達成できたら保存せずに捨てる。
ちょっと形式変えてみたぁ。
バッククォートのせい(笑)
「入門者のLinux」第七章
第七章「ユーザーと管理者」
コンピュータの使用権をアカウントといい、それにはユーザー名とユーザーIDが含まれている。
アカウントがなければ使わせてもらえません。
これらのユーザーの集まりをグループという。
中でも本命のグループを実効グループという。
ディレクトリやファイルの管理にはパーミッションという概念が必要。
ファイルの情報を見た時(ls)に、
・[-rw-rw-r-- 1 marumo marumo 7 7月 22 12:27 ファイル名]
みたいな感じで出てくくる。
[marumo marumo]⇒[ファイルの所有者のユーザー名 所有グループ]
(全てのファイル、ディレクトリにある)
[-rw-rw-r--]⇒ここがパーミッションの仕組み!
パーミッションはそれぞれのっファイルやディレクトリに対してどのような操作を許可するのか定めること。
「r」=読み込み可能
「w」=書き込み可能
「x」=実行可能 を表す。
・[chmod -r output]...「r」をoutputファイルから剥奪=読み込み不可能
右の部分は、所有者(user)に対してのパーミッション。
真ん中の部分は、所有グループ(group)に対してのパーミッション。
左の部分は、その他のユーザー(other)に対してパーミッション。
・[chmod u+rw output]...user(所有者)のみ読み込みと書き込み可能
システム管理の作業に携わるユーザーを1人決め全権を委任する。
それを管理者という。
管理者はすべてのファイルやディレクトリのアクセス権を持つ。
管理者はrootというユーザー名をもつ。
管理者以外のユーザーを一般ユーザーと呼ぶ。
ユーザー追加やパスリセット、インストールなど、システムの根幹に何らかの変更を加えるにはrootにお願いする必要がある。
例えば、
・[mkdir /test]...ルートディレクトリに「test」というファイルを作る
ルートディレクトリは一般ユーザーに書き込み許可がないので、ファイルを作ることができない。
その場合、
・[sudo mkdir /test]...一時的に管理者として「test」というファイルを作れる
管理者の大事な仕事として、システムのアップデート、つまり更新作業がある。
アップデートはインターネットを介してディストリビューションのリポジトリというサーバーに接続し最新パッケージをダウンロードする。
・[sudo apt-get update]...アップデート内容確認
・[sudo apt-get upgrade]...アップデート実行
アップデートはできるだけ頻繁に行うようにする。
ちなみにアップデートは、不具合を直し完成度を高めること。
バージョンアップは、新たな機能を追加したり従来の機能を削除したり使用法を変えたりすること。
「入門者のLinux」第六章
第六章「標準入出力」
「ls」や「cat」のようなコマンドで出てきた処理結果を何らかの形で外に向かって出すことを出力(アウトプット)という。
逆に、コンピュータやソフトに情報を受け流すことを入力(インプット)という。
入力と出力を足して、入出力という。
・[echo]...オウム返しに表示
これを応用すると..
・[echo hello! > output]...”hello!”が「output」に出力される
⇒テキストファイルを作るツールに化ける!
このような機能を出力リダイレクトという。
> ⇒ > ...上書きされる
> ⇒ >> ...前の内容消さず、新しい結果追記
・[bc]...四則演算する
これを応用して..
・[echo 2+3 > input] (出力リダイレクト)
・[bc < input]...bcコマンドに「input」の"2+3"を入力し、処理して出力した
コマンドに対して情報をファイルから渡す機能を入力リダイレクトという。
コマンドに対する入出力テクニックもある。
・[echo 2+3 | bc]
「echo 2+3」というコマンドは「2+3」という文字列を画面に出力する。
しかし、「|」(パイプ)をはさむことで、「bc」というコマンドに渡される。
渡された「bc」コマンドは計算を行う。
「|」は直前のコマンドの出力を、直後のコマンドの入力にすることができる。
パイプでつなぐ作業は他にもよく使われる。
例えば、
・[ls -l /usr/bin | less]...
「less」というコマンドは、画面の縦の長さにい合わせて1ページずつ行き来できるようにするコマンド
「パイプでつないでless」はLinuxの操作でとてもよく使うらしい。
・[ls -l /usr/bin |wc]...
「wc」はテキストデータの行数、語数、文字数を数えるコマンド
リダイレクトやパイプで切り替えられるような入出力のことを標準入出力という。
入力の部分を標準入力。
出力の部分を標準出力。
まとめ
・「>」、「<」でファイルを相手に出入力できる。
・「|」は、あるコマンドの出力を別のコマンドに入力できる。
また、パイプを使って3つ以上のコマンドをつなぐことも可能。(パイプライン)
「入門者のLinux」第五章
第五章「ファイル」
ファイルの種類
・テキストファイル...文字で表された情報。文字コード、キャラクターコードで定められた数値だけが並んで格納されているファイル。
・バイナリファイル...文字コード以外の数値含む
〈コマンド〉
・[cat]...ファイルの中身を表示
・[cp]...コピー
・[mv]...場所移動、名前変更
・[rm]...ファイル消す
ファイル名には、スペースや、[ / ? * < | : ; \ ] などの記号を使わないようにする。
[ - _ . ]はOK!
Unixの文化として、「すべてのデバイスをファイルとして表現する」といものがある。
画面やハードディスクなどコンピュータの部品や周辺機器のデバイスもひとつずつのファイルとして識別、管理しているということ。
「入門者のLinux」第四章
第四章「ディレクトリ」
Linuxにおいてデータを格納する仕組みをディレクトリという。
仕組みとしては、ディレクトリの中にさらにディレクトリやファイルが入ってるって感じ。
シェルを立ち上げた時のカレントディレクトリ = ホームディレクトリ =「~」
〈コマンド〉
・[pwd]...カレントディレクトリがどこなのか表示する
・[cd ○○]...○○に行く(cdだけうつとホームディレクトリ)
・[ls]...ディレクトリやファイルになにが入っているか、情報をみたいとき
・[mkdir]...ディレクトリ作成
・[mv]...場所移動、名前変更
・[rmdir]...消去
パス
ディレクトリやファイルの中には、どこに存在しているかという情報を示すパスがある。
パスには二種類。
・絶対パス...ルートディレクトリからたどっていくもの
カレントディレクトリがどこであろうと通用する。
・相対パス...カレントディレクトリ起点にファイルをたどっていくもの
場所や名前が変わっても通用する。
ざっくりしすぎたかな。