ksaitoの日記

日々試したことの覚え書き

シェル

findの結果をxargsで処理する

findの結果は、xargsで処理すると早くて便利です。 findのexecオプションより早く適切に処理してくれます。 $ find test -type f test/b.txt test/a.txt test/c.txt $ find test -type f | xargs file test/b.txt: empty test/a.txt: empty test/c.txt: empt…

手動のオペレーションを自動化する

以前にexpectコマンドを使って手動のオペレーションを自動化する方法を紹介しました。 自動化したオペレーションのスクリプトにオプション部分を引数で指定したり、cronで定期的に実行するためにスクリプトのインストールディレクトリを認識させることができ…

大量のログを分析する

特定の時間帯で障害が起こった時に、該当時間帯のログを見る必要があります。 ディタでも開くことができないくらい大きいログファイルというケースも多々あります。 大量のログから特定の時間だけを取り出す方法です。 日付や時間帯で切り出す awkで日付や時…

awkでシェル変数を使う

awkでシェル変数を使う方法です。 普通にシェル変数を指定するとawkは理解してくれません。 $ awk '{print $HOME}' aaa awk: illegal field $(), name "HOME" input record number 1, file source line number 1 $シングルクォーテーションの位置を工夫する…

計算機

電卓がなくてもbcコマンドがあれば計算できます。 計算 計算は、式を入力するだけです。 小数点の割り算には、注意が必要です。 $ bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software …

行末の空白を削除する

sedのワンライナーでできます。 $ sed -e 's/[ ]*$//'emacsてもM-x delete-trailing-whitespaceで同じことができます。

手動のオペレーションを自動化する

CUIのプログラムで繰り返し手動のオペレーションが必要な処理が必要な場合には、expectコマンドが便利です。 ログイン時に毎回実行するコマンドを自動化する ログインした時に毎回実行するなら初期設定用の.profileや.*rcに設定するのが普通ですが、利用する…

設定ファイルを探す

設定ファイルが、どこにあるか見当をつけるためにstringsコマンドが使えます。 bashの設定ファイルは、次のようにして当たりをつけます。 $ strings `type -p bash` | grep \^/etc /etc/bash.bashrc /etc/profile /etc/hosts /etc/bash.bash_logout /etc/inp…

Solarisのsarコマンド

sarコマンドでDebian/Ubuntuのsarコマンド設定を書きました。 Solaris11でもSolarisのシステム管理(上級編)にオフシャルな設定がありました。 設定 Solaris11をインストールした状態では、以下のようにsarコマンドを利用できません。 solaris11$ sar sar: ca…

ファイルの更新日付とアクセス日付

ファイルが持っている日付情報は、3つあります。 最初にファイルを作成すると全て同じ日付になっています。 $ touch test.txt $ stat test.txt File: `test.txt' Access: 2012-04-01 16:16:20.549952288 +0900 Modify: 2012-04-01 16:16:20.549952288 +0900…

ファイルから特定の行を取り出す

ファイルから特定の行を取り出すワンライナーです。 下記は、/etc/passwdの2行目を取り出します。 $ awk 'NR==2' /etc/group daemon:x:1: $ 応用編で特定の行の特定のフィールドを取り出します。 $ awk 'BEGIN { FS=":" } NR==2 {L2=$3} NR==4 {L4=$3} END {…

bashのデバッグ

bashは、構文チェック、デバッグメッセージが使えることは知っていましたが、デバッガが使えるとは知りませんでした。 構文チェック シェルの構文チェックは、-nオプションが使えます。 デバッグを始める前に、シェルの文法チェックをすることができます。 $…

コンパイラのないマシンにコマンドをコピーする方法

使いたいコマンドがインストールされていないときは、ソースからコンパイルします。 コンパイラがインストールされていないマシンの場合、すでのコマンドがインストールされている同じアーキテクチャのマシンからコピーしてくることもできます。

awkで複数ファイルにデータを出力する

行単位のデータを、ある条件で複数のファイルに振り分ける処理をするときbashのreadが思い浮びますが行単位のデータにスペースが含まれると処理によっては都合が悪いことが多いです。 そこで、awkの">"や">>"を使うと、さまざまな条件で行を複数のファイルに…

シェルの重複起動防止

同じシェルを複数起動しないようにするには、ロックファイルを使う方法が良く知られています。 単純明快な方法ですがシェルがkill -9で停止した場合には、タイミングによってロックファイルが削除されないことがあります。 メンテナンスフリーで重複起動を防…

bashのfor文

bashのfor文で1から10まで繰り返す処理を書く場合には、seqコマンドを使います。 $ for i in `seq 1 10` > do > echo $i > done 1 2 3 4 5 6 7 8 9 10 $seqコマンドは、カウントアップする数字を指定することもできます。 $ seq 1 2 10 1 3 5 7 9 $

makeの暗黙のルールに翻弄される

Makefileに記述した覚えのない処理が追加されてしまい、しばらく悩みました。 abcというターゲットをビルドすると、下記の処理が末尾で実行されます。 cat abc.sh >abc chmod a+x abcいろいろ調べた結果、makeの暗黙のルールで実行されるコマンドということ…

scpの不具合

scpでserver1からserver2にファイルをコピーしようとすると2つめのサーバの名前解決ができませんでした。 $ scp user1@server1.local:/home/user1/.bashrc user2@server2.local:/tmp ssh: server2.local: Name or service not known lost connection $バージ…

ディレクトリの移動

作業中に一時的にディレクトリを移動して、戻ってきたいことがあります。 こういったときには、pushd/popdというコマンドが便利です。 cdコマンドの代りにpushdコマンドを使い、もとの場所に戻るときにpopdコマンドを使います。 /tmpで作業中に、/etcの設定…

xargs

シェルで前処理した結果のファイル一覧に対してコマンドを実行したい場合、``でコマンドを囲むのが便利です。

makeでシェルの結果を利用する

makeでログファイルや実行結果を保存する場合、タイムスタンプを付けたファイルやディレクトリを使いたいことがあります。 単純にdateコマンドで作成したタイムスタンプをTSという変数に入れてみます。 $ cat Makefile TS=`date +%Y%m%d%H%M%S` all: echo ${…

sarコマンド

sarコマンドは、サーバリソースの統計情報を収集するツールです。 aptのパッケージでは、sysstatパッケージを入れると使えるようになりますが、Ubuntu(たぶんDebianも)デフォルト設定のままでは動きません。 $ sudo apt-get sysstat $ sar /var/log/syssta…

sedのエスケープ

sedコマンドを使って文字列の置換ができます。 $ echo abababa | sed -e 's/b/a/g' aaaaaaa $ 置換する文字列に"/"が含まれる場合、"\"でエスケープすることができます。 $ echo abababa | sed -e 's/b/\//g' a/a/a/a $ エスケープする文字が多かったりする…

tailをsedで代替えする

tailコマンドには、先頭の3行以降を表示するのに-n +3というオプションが使えます。 古い環境では、-n 3は、使えても-n +3は使えないことがあります。 そんな場合は、sedコマンドで代用できます。 $ cat text.txt 1 2 3 4 5 $ tail -n +3 text.txt 3 4 5 $ s…

シェルで部分文字列を取り出す

シェルで部分文字列を取り出す場合にexprコマンドのsubstrが使えます。 exprコマンドは、数字文字列の四則演算や文字列操作などシェルで使えるコマンドです。 $ expr substr "1234" 1 1 1 $ expr substr "1234" 2 2 23 $ expr substr "1234" 1 2 12 $ 残念な…

watchコマンドの代替え

ファイルやプロセスの監視には、watchコマンドが便利です。 一部のOSでwatchコマンドがインストールされていない場合にshやbashでは、whileとclearとsleepを使って同じようなことができます。 出力結果が1画面に収まるとちょっとしたコンソールのように見え…