いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.144 / 読者数:1321名

こんばんは、うすだです。

普段は、M で始まる某巨大ソフトウェア企業の製品を毛嫌いする… ふりをしているわたしですが、こんな興味深いページを見つけました。

バグや問題を「MSのせい」にする技術者、いませんか?
http://slashdot.jp/developers/08/08/28/0438242.shtml

わたしは、大昔、Windows CE 用のドライバに、レジストリをクローズし忘れる、 という劣悪なバグを混入させたことがあります。
そのため、デバイスを使用するとメモリリークが発生して動かなくなる、 という現象が、客先で発生してしまいました。

当初は、また MS のバグじゃないの? と思いましたが、 すったもんだの末に自分の過ちを発見したときには、 ものすごく穴に入りたくなりました。

で、上記コメント欄には、そんな自責の念にかられた意見で溢れてるのかと思いきや、 MS のバグはやっぱり(略)…という意見が大半でした。

みんな、それだけ M 社のことが好きなんですね。
まだまだこれからも、M 社の反映は続くのだろうなあ、と思いました。

飛躍した結論に達したところで、今回も、はりきってまいります。

今回のお題 - コマンドラインを使いこなす / ダークナイト

ちょうど2年ほど前に、コマンドラインを制する者は世界を制す、ということで、 シェルのコマンドラインで効率よく作業するためのあれこれを、 ご紹介させていただきました。

Vol.072 - コマンドラインを使いこなす
http://www.usupi.org/sysad/072.html
Vol.073 - コマンドラインを使いこなす / フォーエバー
http://www.usupi.org/sysad/073.html

いまや、GUI な環境はあって当然、という時代になりましたが、 それでもシステム管理者の作業の大半は、 コマンドライン上で行われるのではないかと思います。

24時間戦わなければならないシステム管理者にとって、 コマンドライン上での作業を効率よく行うことが、自身の健康や家族円満、 そして世界平和につながるといっても過言ではありません。(最後のはやや過言ですが。)

というわけで、2年も経てばほとぼりも醒めているかなと思いますので、 今回は、ひさしぶりに、続編をお送りしたいと思います。

ただ、前回は csh も視野に入れていましたが、今回は bash に限らせていただきます。 申し訳ございません。


まずは、変数の中身をちょこっと変更する方法を、ご紹介します。

ファイルのフォーマットを変換するときに、 サフィックスを変えたくなることってありますよね。
そんなときのために、変数の末尾から、 パターンにマッチする部分を削除してくれる機能が、bash にはあります。 以下のように指定します。

  ${変数名%パターン}

たとえば、$file の中身が 080208.jpg の場合、${file%.jpg} と指定しますと、 末尾の .jpg を取り除いた結果が得られます。

  $ file=080208.jpg
  $ echo ${file%.jpg}
  080208

ですので、080208.png という名前にしたい場合は、 ${file%.jpg}.png とすればよいです。(もちろん、${file%jpg}png でも構いません。)

  $ echo ${file%.jpg}.png
  080208.png

 

逆に、変数の先頭から、パターンにマッチする部分を削除するには、 以下のように指定します。

  ${変数名#パターン}

たとえば、$file の 080208.jpg の先頭の 08 を消したい場合は、 以下のようにしてみましょう。

  $ echo ${file#08}
  0208.jpg

ですので、先頭の 08 を Aug に置き換えるには、以下のようにします。

  $ echo Aug${file#08}
  Aug0208.jpg

 

末尾からとか先頭からとかに関係なく、文字列を置換したい場合は、 以下のように指定します。

  ${変数名/パターン/文字列}
  ${変数名//パターン/文字列}

「パターン」が「文字列」に置き換わります。
前者は、最初に一致したところだけが置換されますが、後者はすべて置換されます。

たとえば、$file の 080208.jpg の 02 を -2 に置換したいなら、以下のようにします。

  $ echo ${file/02/-2}
  08-208.jpg

08 をすべて 2008 にしたい場合は、以下のようにします。

  $ echo ${file//08/2008}
  2008022008.jpg

 

上記は、複数のファイルなどに対して、同じ処理を行いたいときに、重宝します。
たとえば、カレントディレクトリにあるGIFファイルを、 ImageMagick の convert コマンドを用いて、すべて PNG に変換したいなら、 以下のように実行すればよいと思います。

  $ for file in *.gif; do
  > convert $file ${file%.gif}.png
  > done

次に、括弧で囲んで、まとめて実行する方法を、ご紹介します。

複数のコマンドの実行結果を、1つのメールでまとめて通知させたいときが、 たまにありますよね。…あ、あると思ってください。

たとえば、ロードアベレージと、ネットワークインターフェースの送受信の状況を、 以下のようにまとめて出力したいとしましょう。
具体的には、以下のように実行しますと、

  $ echo "Load: `cat /proc/loadavg`"; echo "Network:"; \
  LANG=C /sbin/ifconfig eth0 | grep packets

以下のような結果が出力されます。

  Load: 0.10 0.02 0.00 2/140 19189
  Network:
         RX packets:187829 errors:0 dropped:0 overruns:0 frame:0
         TX packets:155251 errors:0 dropped:0 overruns:0 carrier:0

これを、パイプを使って、Mail コマンドへ渡しても、 出力結果すべてが Mail コマンドに渡されるわけではありません。
実際には、最後に実行された ifconfig eth0 | grep packets の結果だけが渡されて、 前半部分はそのまま出力されてしまいます。

  $ echo "Load: `cat /proc/loadavg`"; echo "Network:"; \
  LANG=C /sbin/ifconfig eth0 | grep packets \
  | /usr/bin/Mail -s 'Load & Net' usu@usupi.org
  Load: 0.10 0.02 0.00 2/140 19189
  Network:

そんなときには、まとめたい処理を、括弧で囲んでしまいましょう。
括弧で囲むと、今のシェルがコマンドを直接実行するのではなく、 新たにシェルを作成(fork)して、その新しいシェルにコマンドを実行させます。
ですので、括弧で囲んだ処理の出力結果が、1つにまとめられます。

  $ (echo "Load: `cat /proc/loadavg`"; echo "Network:"; \
  LANG=C /sbin/ifconfig eth0 | grep packets) \
  | /usr/bin/Mail -s 'Load & Net' usu@usupi.org

 

また、括弧で囲みますと、変数の上書きを防ぐこともできます。
たとえば、先ほどのGIFファイルの変換を実行しますと、 変数 file が書き換わってしまいます。

  $ file=/etc/hosts
  $ for file in *.gif; do convert $file ${file%.gif}.png; done
  $ echo $file
  090608.gif

これを、括弧で囲むことで、書き換わらないようにできます。
(新しいシェルの中で $file を使用していますので、その影響は、 新しいシェルの中だけに限定することができます。)

  $ file=/etc/hosts
  $ (for file in *.gif; do convert $file ${file%.gif}.png; done)
  $ echo $file
  /etc/hosts

最後に、eval をご紹介して、終わりにしたいと思います。

eval は、引数を実行してくれる、とても変わったコマンドです。
eval の引数に、実行したいコマンドを指定すると、それを実行します。

  $ eval echo test
  test

この場合は、普通に echo test を実行するのと変わりませんが、 eval のすごいところは、評価した結果を、直接実行できるところにあります。

たとえば、変数に格納されている名前の変数に、代入などができます。
…ああ、書いていて自分でもこんがらがるのですが、たとえば以下の場合ですと、 $varname に格納されている test という名前の変数に、 文字列 (hello world)を代入しています。

  $ varname="test"
  $ eval $varname=\"hello world\"
  $ echo $test
  hello world
  $ echo $varname
  test

他にも、条件式を $exp に格納しておいて、 それを eval で直接実行するなんていうことも、可能です。

  $ (res=0; for exp in '$USER != root' '`id -g` -ge 100'; do
  > eval [ $exp ] || res=`expr $res + 1`
  > done; [ $res -eq 0 ] && echo 'OK!' || echo "NG...($res)")
  OK!

$USER が root でなくグループID が 100 以上なら OK! と、 そうでないなら NG...(条件が一致しなかった数) と出力します。
最初の条件や、結果の echo を、別の条件やコマンドにすれば、 他の用途にも使える…かもしれません。


以上、コマンドラインを使いこなす上で、知っていると便利なもの、 便利かもしれないものなどを、ご紹介しました。

最後の eval なんかは、コマンドラインで使うには、 ちょっと複雑すぎるかもしれません。ただ、複数の処理をまとめたくなったとき、 必要となることがあります。とりあえず、無理矢理にでも使って、 慣れておくとよいのではないかと思います。

いずれにしましても、こういうことがささっとできると、 いっしょに作業しているひとに、こやつできるな、 などと思われるかもしれません。
そんなときのため、今のうちに、こっそり練習しておきましょう。

宿題の答え

前回の宿題は、

  ディレクトリやシンボリックリンクの時刻情報を調べてみましょう。

でした。

ディレクトリの場合、さらっと確認した限りでは、 以下の際に時刻情報が更新されました。

mtime
ディレクトリ直下で、ファイルを作成・削除したとき。
ctime
ディレクトリ直下で、ファイルを作成・削除したとき。
ファイル名の変更や、chmod コマンドなどで属性を変更したとき。
atime
ls コマンドやシェルの補完機能などによって参照したとき。

ディレクトリの中身と言えば、ディレクトリエントリだと思います。 これが変更されると、mtime と ctime が更新されるという寸法ですね。
ちなみに、ディレクトリ直下のファイルに対して、書き込みや属性変更を行っても、 ディレクトリの時刻情報は更新されませんでした。

シンボリックリンクの場合は、以下の際に時刻情報が更新されました。

mtime
(更新されない。)
ctime
ファイル名を変更したとき。(chmod などでは実体の方のみ更新)
atime
ls コマンドや cat コマンドで参照したとき。

属性を変更しようとすると、実体のファイルの方が更新されます。
ファイルの中身を変更したときも、同様です。
lutimes システムコールを使えば、シンボリックリンクの mtime も更新できますが、 残念ながら Linux にはありません。まあ、必要あるのかという気もしますけど…。

上記の確認手順につきましては、 前回のつたない文章をご覧いただければ自明だと思いますので、 申し訳ありませんが、ごっそり割愛します。

Vol.143 - ファイルの時刻情報を知る
http://www.usupi.org/sysad/143.html

今回の宿題

今回の宿題は、

  テキストファイル(*.txt)の文字コードを EUC-JP に変換したファイル
  (*.euc.txt) を、作成してください。

です。

元のファイルが *.txt だと仮定して、 文字コードを EUC-JP に変換した *.euc.txt というファイルを作成してください。
もとのファイルは、もしものために残しておきましょう。

あとがき

わたしがプログラマーだからでしょうか、我が子が、突然、 プログラムを作ってみたいなどと言い出しました。

わたし自身は、中学のときに 8ビットマイコンを買ってもらい、 BASIC でゲームを作ったりしていました。ちょうどそのころ、 NHK でマイコン入門という番組をやるくらい、 8ビットマイコンがブームだったんですね。
(ちなみに、当時の「マイコン」は、いわゆる「パソコン」のことです。)

それはさておき、わが子には、なにから手をつけてもらえばよいかな、 と少々悩んでみました。

いきなり C とか Java とかは敷居が高いですし、 いまどき BASIC というのもなんだかなーという気がします。(偏見だー)

いろいろ検索した結果、世間の評判的には、Squeak がよさそうだという感触を、 かすかに得ました。

Squeak - Wikipedia
http://ja.wikipedia.org/wiki/Squeak

そういえば、20世紀末から、Squeak の存在は知っていて、 勉強しようという気持ちはありましたが、当時はインストールだけで満足してしまい、 その後は忘却の彼方に押しやっていた、ということを思い出しました。

今回こそは、我が子のため、きちんと覚えて、教えてみたいと思います。
その後、Squeak のことに触れなくなりましたら、 その後どーなったんだというツッコミをしていただけますと、幸いです。(どきどき)

また、Squeak ってこんなんだよとか、もっといい言語があるよ、 というご意見などありましたら、ご連絡いただけますと、もっと幸いです。
(これを書いた直後に、Squeak から派生した Scratch というものがあることを 知りました。でも、最新版は Windows XP 以降じゃないと動作しないんですよね…。 Linux はもともと未対応ですし…。)

 

今回も、ここまで読んでいただき、ありがとうございました。
それでは、次回は 9月21日(日) 頃に、お会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」−いよいよ栗シーズンがせまって来ましたね!
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本