「小ネタ」の編集履歴(バックアップ)一覧はこちら
「小ネタ」(2013/06/02 (日) 23:57:28) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
#contents()
** ファイルパスからファイル名だけを取り出す
$ basename /home/test/package/test.sh
test.sh
** 日付時刻の整形出力
$ date +"%Y-%m-%d %H:%M:%S"
2012-01-14 17:45:55
ずっとdateコマンドでは秒より小さい値を表示できないとおもっていた。dateコマンドのhelpを見ると、「%N」でナノ秒が表示できることがわかった。
$ date +"%Y-%m-%d %H:%M:%S.%N"
2012-02-28 23:28:41.856765220
** 不要なファイルを除いてtarコマンドでアーカイブする
tarでディレクトリ配下をまとめてアーカイブする際に、特定のファイル/ディレクトリを除いてアーカイブするには以下のようにする。
tar zcvf filename.tar.gz ./dirname --exclude ".svn"
ライブラリ管理にSubversionを使っているが、チェックアウト時に.svnというディレクトリが作れてしまい、チェックアウトしたファイルだけをtarでアーカイブしたいのに、この.svnまでアーカイブされて困っていた。上記のように --exclude オプションの後に除外したいファイル名(.svn)を書くと、該当のファイルやディレクトリを除外してくれる。
複数のファイル名を除外したい場合は、以下のように --exclude を複数書くか 「--exclude-from 除外ファイル名リストファイル」を使うとできます。
tar zcvf filename.tar.gz ./dirname --exclude ".svn" --exclude "test"
または
tar zcvf filename.tar.gz ./dirname --exclude-from exclude-list-file
exclude-list-file内は、除外するファイル名を改行して書きならべる
** 定期的にコマンドを実行する
watchコマンドが使える。
watchは指定されたコマンドを繰り返し実行しその出力を表示する。ただし一画面に収まるまでしか表示しないので注意が必要。
デフォルトは2 秒毎に実行するが、-n <秒>または --interval=<秒>で間隔を変更可能。
-dを付けると、変化部分をハイライト表示してくれる。
-60秒毎にls -lする。
watch -n 60 ls -l
**指定時間入力がなかったらターミナルを終了する。
環境変数TMOUTを設定すればよい。
sshでリモートでターミナルを操作するような場合に設定しておくと、うっかりログアウトし忘れても自動的にログオフするので便利かも。
-300秒入力がなければターミナルを終了する。
export TMOUT=300
** 乱数を使う
bash専用だが、&bold(){&color(red){RANDOM}}という、毎回0〜32767 までのランダムな整数を返すシェル変数がある。
$ echo $RANDOM
4158
X〜(Y-1)の範囲の乱数が必要な場合は、'$RANDOM % (Y-X) + X'で生成できます。例えば100〜200の
$ echo $(( $RANDOM % 101 + 100 ))
195
shでも使える乱数としては、/dev/random、/dev/urandomがあります。
以下のサイトが参考になります。
[[http://www.cyberciti.biz/faq/bash-shell-script-generating-random-numbers/]]
** マウントせずにISOイメージ内を見る
$ isoinfo -l -i pclinuxos-2009.1-jp.iso <ーー -l により、'ls -lR'の出力結果が見える。
** awkを使って指定ファイルの合計サイズを求める
$ ls -l /var/log/syslog.* | awk '{i+=$5}END{print i}'
692654
$ ls -l /var/log/syslog.*
-rw-r----- 1 syslog adm 355144 2010-06-26 08:54 /var/log/syslog.1
-rw-r----- 1 syslog adm 21054 2010-06-25 01:01 /var/log/syslog.2.gz
-rw-r----- 1 syslog adm 21030 2010-06-23 20:05 /var/log/syslog.3.gz
-rw-r----- 1 syslog adm 39582 2010-06-22 23:51 /var/log/syslog.4.gz
-rw-r----- 1 syslog adm 116482 2010-06-21 23:26 /var/log/syslog.5.gz
-rw-r----- 1 syslog adm 79329 2010-06-20 08:43 /var/log/syslog.6.gz
-rw-r----- 1 syslog adm 60033 2010-06-19 09:33 /var/log/syslog.7.gz
**バックグラウンドとフォアグラウンド
ターミナルからコマンドを実行するとフォアグラウンドで実行され、コマンドが終わるまで次のコマンドが実行できない。
逆に、コマンドの最後に'&'をつけて実行すると、バックグラウンドで実行され、コマンド実行中でも別のコマンドを実行できる。
以下のようにすると、バックグランドとフォアグラウンドを切り替えることができる。
$ cat bgfg.sh <-- 40秒間sleepして、slep endを表示する。
#!/bin/bash
sleep 40
echo "sleep end"
$ ./bgfg.sh & <-- バックグラウンドで起動
[1] 3686
$ jobs
[1]+ 実行中 ./bgfg.sh &
$ fg %1 <-- ジョブ1をフォアグラウンドに
./bgfg.sh
^Z <-- Ctrl+zでフォアグラウンドのジョブを一旦停止する。
[1]+ 停止 ./bgfg.sh
$ bg #1 <-- ジョブ1をバックグラウンドに
[1]+ ./bgfg.sh &
$ jobs
[1]+ 実行中 ./bgfg.sh &
$ sleep end <--ここで終了
[1]+ 終了 ./bgfg.sh
**nopコマンド
何も実行したく無い場合は ':'(コロン)を使うとnopコマンド(no operation)となる。
ifの条件式でfalseの場合のみ何か実行したい場合に使うときがある。
例えば、xxxx.txtファイルがない場合だけメッセージを出す場合は以下のようにする。
if [ -f xxxx.txt ];then
:
else
echo "xxxx.txt is not found!"
fi
**文字列を16進文字コードで出力
文字列を16進数の文字コードで出力したい場合、以下のようにすればよい。
echo -n "入力文字列" | od -w100 -tx1 | cut -c9- | sed 's/ //g'
odコマンドで16進ダンプを出力し、そこからcutでオフセット表示を削除し、スペースを詰めるというかなりの力技です。
なお、odの-w100は、入力文字列のダンプ結果を1行で表示したいため、1行あたり100byte分表示させている。もっと長い文字列を扱いたい場合は、ここを大きくすればよい。
**連続した数を得る
seqコマンドを使う。デフォルトは開始値1、増分値1、セパレータは\n。
$ seq -s " " 5 <ーー終了値のみ
1 2 3 4 5
$ seq -s " " 2 5 <ーー開始値と終了値
2 3 4 5
$ seq -s " " -5 3 6 <ーー開始値、増分値、終了値
-5 -2 1 4
$ fff=100
$ seq -s " " 0 25 $fff <ーー環境変数も使える
0 25 50 75 100
$ seq --format='No.%03g' -s " " 0 25 100 <ーーformat指定
No.000 No.025 No.050 No.075 No.100
※printfのfomatとmanにはあるが、%xや%dなどは使えなかった。
他にも、{開始値..終了値}も使える。増分は1固定の模様。
$ echo {0..5}
0 1 2 3 4 5
$ echo {000..5} <ーー桁数を揃える
000 001 002 003 004 005
よくfor文の中でつかったりするが、touchコマンドと組み合わせると、拡張子を連番にするなどが簡単にできる。
$ touch test.{000..005}
$ ls test*
test.000 test.001 test.002 test.003 test.004 test.005
**複数のコマンドの組み合わせ(リスト)
リスト (list) とは、1つ以上のパイプラインを演算子 ;, &, &&, || のいずれかで区切って並べたもの。
command1 ; command2 : command1の実行完了後にcommand22を実行
command1 || command2 : command1が0以外の終了ステータスで終了した場合に限り command2 を実行
command1 && command2 : command1が0の終了ステータスで終了した場合に限りcommand2を実行
**コメント行と空行をのぞいて出力する。
先頭が#あるいは、スペースまたはタブが続いて#がくる行と、先頭から行末までに何もないかスペースまたはタブが続く行をのぞいて出力する。以下のどちらかを使えばよい。
egrep -v ^[[:space:]]*# $1 | egrep -v ^[[:space:]]*$
sed '/^[ \t]*#/d' ipsec.conf | sed '/^[ \t]*$/d'
なお、以下ではうまくいかなかった。
egrep -v ^[ \t]*# $1 | egrep -v ^[ \t]*$
**TCPまたはUDPで通信
以下の書式で/dev/tcp、/dev/udpにデータを与えると、TCPまたはUDPで通信ができる。
1.TCP
/dev/tcp/ホスト名/ポート番号
2.UDP
/dev/udp/ホスト名/ポート番号
例 $ echo "test data" > /dev/tcp/localhost/8000
----
#comment()
----
#contents()
** ファイルパスからファイル名だけを取り出す
$ basename /home/test/package/test.sh
test.sh
** 日付時刻の整形出力
$ date +"%Y-%m-%d %H:%M:%S"
2012-01-14 17:45:55
ずっとdateコマンドでは秒より小さい値を表示できないとおもっていた。dateコマンドのhelpを見ると、「%N」でナノ秒が表示できることがわかった。
$ date +"%Y-%m-%d %H:%M:%S.%N"
2012-02-28 23:28:41.856765220
** 不要なファイルを除いてtarコマンドでアーカイブする
tarでディレクトリ配下をまとめてアーカイブする際に、特定のファイル/ディレクトリを除いてアーカイブするには以下のようにする。
tar zcvf filename.tar.gz ./dirname --exclude ".svn"
ライブラリ管理にSubversionを使っているが、チェックアウト時に.svnというディレクトリが作れてしまい、チェックアウトしたファイルだけをtarでアーカイブしたいのに、この.svnまでアーカイブされて困っていた。上記のように --exclude オプションの後に除外したいファイル名(.svn)を書くと、該当のファイルやディレクトリを除外してくれる。
複数のファイル名を除外したい場合は、以下のように --exclude を複数書くか 「--exclude-from 除外ファイル名リストファイル」を使うとできます。
tar zcvf filename.tar.gz ./dirname --exclude ".svn" --exclude "test"
または
tar zcvf filename.tar.gz ./dirname --exclude-from exclude-list-file
exclude-list-file内は、除外するファイル名を改行して書きならべる
** 定期的にコマンドを実行する
watchコマンドが使える。
watchは指定されたコマンドを繰り返し実行しその出力を表示する。ただし一画面に収まるまでしか表示しないので注意が必要。
デフォルトは2 秒毎に実行するが、-n <秒>または --interval=<秒>で間隔を変更可能。
-dを付けると、変化部分をハイライト表示してくれる。
-60秒毎にls -lする。
watch -n 60 ls -l
**指定時間入力がなかったらターミナルを終了する。
環境変数TMOUTを設定すればよい。
sshでリモートでターミナルを操作するような場合に設定しておくと、うっかりログアウトし忘れても自動的にログオフするので便利かも。
-300秒入力がなければターミナルを終了する。
export TMOUT=300
** 乱数を使う
bash専用だが、&bold(){&color(red){RANDOM}}という、毎回0〜32767 までのランダムな整数を返すシェル変数がある。
$ echo $RANDOM
4158
X〜(Y-1)の範囲の乱数が必要な場合は、'$RANDOM % (Y-X) + X'で生成できます。例えば100〜200の
$ echo $(( $RANDOM % 101 + 100 ))
195
shでも使える乱数としては、/dev/random、/dev/urandomがあります。
以下のサイトが参考になります。
[[http://www.cyberciti.biz/faq/bash-shell-script-generating-random-numbers/]]
** マウントせずにISOイメージ内を見る
$ isoinfo -l -i pclinuxos-2009.1-jp.iso <ーー -l により、'ls -lR'の出力結果が見える。
** awkを使って指定ファイルの合計サイズを求める
$ ls -l /var/log/syslog.* | awk '{i+=$5}END{print i}'
692654
$ ls -l /var/log/syslog.*
-rw-r----- 1 syslog adm 355144 2010-06-26 08:54 /var/log/syslog.1
-rw-r----- 1 syslog adm 21054 2010-06-25 01:01 /var/log/syslog.2.gz
-rw-r----- 1 syslog adm 21030 2010-06-23 20:05 /var/log/syslog.3.gz
-rw-r----- 1 syslog adm 39582 2010-06-22 23:51 /var/log/syslog.4.gz
-rw-r----- 1 syslog adm 116482 2010-06-21 23:26 /var/log/syslog.5.gz
-rw-r----- 1 syslog adm 79329 2010-06-20 08:43 /var/log/syslog.6.gz
-rw-r----- 1 syslog adm 60033 2010-06-19 09:33 /var/log/syslog.7.gz
**バックグラウンドとフォアグラウンド
ターミナルからコマンドを実行するとフォアグラウンドで実行され、コマンドが終わるまで次のコマンドが実行できない。
逆に、コマンドの最後に'&'をつけて実行すると、バックグラウンドで実行され、コマンド実行中でも別のコマンドを実行できる。
以下のようにすると、バックグランドとフォアグラウンドを切り替えることができる。
$ cat bgfg.sh <-- 40秒間sleepして、slep endを表示する。
#!/bin/bash
sleep 40
echo "sleep end"
$ ./bgfg.sh & <-- バックグラウンドで起動
[1] 3686
$ jobs
[1]+ 実行中 ./bgfg.sh &
$ fg %1 <-- ジョブ1をフォアグラウンドに
./bgfg.sh
^Z <-- Ctrl+zでフォアグラウンドのジョブを一旦停止する。
[1]+ 停止 ./bgfg.sh
$ bg #1 <-- ジョブ1をバックグラウンドに
[1]+ ./bgfg.sh &
$ jobs
[1]+ 実行中 ./bgfg.sh &
$ sleep end <--ここで終了
[1]+ 終了 ./bgfg.sh
**nopコマンド
何も実行したく無い場合は ':'(コロン)を使うとnopコマンド(no operation)となる。
ifの条件式でfalseの場合のみ何か実行したい場合に使うときがある。
例えば、xxxx.txtファイルがない場合だけメッセージを出す場合は以下のようにする。
if [ -f xxxx.txt ];then
:
else
echo "xxxx.txt is not found!"
fi
**文字列を16進文字コードで出力
文字列を16進数の文字コードで出力したい場合、以下のようにすればよい。
echo -n "入力文字列" | od -w100 -tx1 | cut -c9- | sed 's/ //g'
odコマンドで16進ダンプを出力し、そこからcutでオフセット表示を削除し、スペースを詰めるというかなりの力技です。
なお、odの-w100は、入力文字列のダンプ結果を1行で表示したいため、1行あたり100byte分表示させている。もっと長い文字列を扱いたい場合は、ここを大きくすればよい。
**連続した数を得る
seqコマンドを使う。デフォルトは開始値1、増分値1、セパレータは\n。
$ seq -s " " 5 <ーー終了値のみ
1 2 3 4 5
$ seq -s " " 2 5 <ーー開始値と終了値
2 3 4 5
$ seq -s " " -5 3 6 <ーー開始値、増分値、終了値
-5 -2 1 4
$ fff=100
$ seq -s " " 0 25 $fff <ーー環境変数も使える
0 25 50 75 100
$ seq --format='No.%03g' -s " " 0 25 100 <ーーformat指定
No.000 No.025 No.050 No.075 No.100
※printfのfomatとmanにはあるが、%xや%dなどは使えなかった。
他にも、{開始値..終了値}も使える。増分は1固定の模様。
$ echo {0..5}
0 1 2 3 4 5
$ echo {000..5} <ーー桁数を揃える
000 001 002 003 004 005
よくfor文の中でつかったりするが、touchコマンドと組み合わせると、拡張子を連番にするなどが簡単にできる。
$ touch test.{000..005}
$ ls test*
test.000 test.001 test.002 test.003 test.004 test.005
**複数のコマンドの組み合わせ(リスト)
リスト (list) とは、1つ以上のパイプラインを演算子 ;, &, &&, || のいずれかで区切って並べたもの。
command1 ; command2 : command1の実行完了後にcommand22を実行
command1 || command2 : command1が0以外の終了ステータスで終了した場合に限り command2 を実行
command1 && command2 : command1が0の終了ステータスで終了した場合に限りcommand2を実行
**コメント行と空行をのぞいて出力する。
先頭が#あるいは、スペースまたはタブが続いて#がくる行と、先頭から行末までに何もないかスペースまたはタブが続く行をのぞいて出力する。以下のどちらかを使えばよい。
egrep -v ^[[:space:]]*# $1 | egrep -v ^[[:space:]]*$
sed '/^[ \t]*#/d' ipsec.conf | sed '/^[ \t]*$/d'
なお、以下ではうまくいかなかった。
egrep -v ^[ \t]*# $1 | egrep -v ^[ \t]*$
**TCPまたはUDPで通信
以下の書式で/dev/tcp、/dev/udpにデータを与えると、TCPまたはUDPで通信ができる。
1.TCP
/dev/tcp/ホスト名/ポート番号
2.UDP
/dev/udp/ホスト名/ポート番号
例 $ echo "test data" > /dev/tcp/localhost/8000
----
#comment()
----