S-JIS[2006-05-27/2012-03-04] 変更履歴

UNIXコマンド組み合わせ

UNIXでは、複数のコマンドを組み合わせて色々なことが出来るような思想になっている。


出力内容をファイルと画面に表示

何かのコマンドを実行し、そのコマンドが標準出力標準 エラーに出力する内容をファイルと画面(標準出力)に表示する例。

% 何かのコマンド 2>&1 | tee ファイル

出力の先頭項目を取得

何かのコマンドを実行し、そのコマンドが標準出力に出力した内容の先頭1項目を画面(標準出力)に表示する例。

% 何かのコマンド | cut -f 1 -d' '
% 何かのコマンド | awk '{print $1}'

データ種類のカウント

特定位置に出てくる文字列の種類の個数を数える例。[2007-10-25]

% cut -c桁 ファイル | sort | uniq | wc -l

ファイルの圧縮・展開

targzipを使って圧縮・展開する例。

% tar -c ディレクトリ | gzip > dir.tar.gz
% gzip -cd archive.tgz | tar -xC 展開先ディレクトリ

複数ファイルの内容検索

ディレクトリ「/usr/include」配下でC言語のヘッダーファイル(拡張子h)の全ファイルから文字列を含むファイルを検索する例。

xargsを使うと、パイプで渡された内容が引数として扱える。

$ find /usr/include -name "*.h" | xargs grep 検索文字列

バッククォート又は$付きの丸括弧でくくると その中が先に実行され、標準出力に出力された内容が引数として扱われる。

$ grep 検索文字列 `find /usr/include -name "*.h"`
$ grep 検索文字列 $(find /usr/include -name "*.h")

findの-execオプションを使うと、見つけたファイル毎に指定したコマンドが実行される。

$ find /usr/include -name "*.h" -exec grep 検索文字列 {} \;

プロセスの存在チェック

特定のコマンド名のプロセスが実行されているかどうかを調べる例。[2008-05-17]

% ps -elf | grep COMMAND | grep -v grep

psでプロセス一覧を表示し、COMMANDという文字列がある行だけをgrepで絞り込む。
ただしそれだけだと、タイミングによってはgrepコマンド自身のプロセスも表示されてしまう。
そこで、さらに「-vオプションを付けたgrep」を実行することにより、grepを含む行は除外している。

だから、調査したいコマンド(文字列)の中に“grep”という語があったらダメだろうけど…あまりそういう例は無いと思われるが、ありそうな時は気をつけるべし。


プロセスを実行している人の調査

psで表示される端末名(TTY)を見てwhoで探せば、どこのIPアドレスから接続しているユーザーか調査できる。

% ps -ef | head -1
     UID   PID  PPID  C    STIME TTY      TIME CMD
% ps -ef | grep java
     hoe 11491     1  0   4月 27 ?        0:05 java Loop
     hoe 18212     1  0 21:12:57 pts/7    0:00 java Sample

↑TTYが「?」になっているのは、以前telnetからバックグラウンドで実行してtelnetは切断したもの。

% who
hoe        pts/16        4月 28日 19:31    (192.168.0.2)
zzz        pts/17        4月 28日 19:57    (192.168.0.3)
hoe        pts/7         4月 28日 20:03    (192.168.0.3)

端末を閉じても裏で実行し続ける方法

コマンドを実行する際に末尾に「&」を付けるバックグラウンドで実行される。[2012-03-04]

$ sleep 1m &

バックグラウンドで実行したかったのに「&」を付け忘れた場合は、一旦Ctrl+Zで止め、bgでバックグラウンドに変更できる。

$ sleep 1m	←実行後にCtrl+Zを押す
[1]+  Stopped                 sleep 1m
$ bg
[1]+ sleep 1m &

しかし、(環境設定にもよるが、)実行している端末(term・telnet等)を閉じると、バックグラウンドで実行していたコマンドも終了してしまう。
終了させない為には、端末を閉じた際に各コマンドに送られるSIGHUP(ハングアップ)シグナルを無視すればよい。
nohupを使ってコマンドを実行すると、SIGHUPが無視されるようになる。

$ nohup sleep 1m &

nohupを付けずに実行開始してしまった場合は、disownでSIGHUPを無視するように出来る。

$ sleep 1m &
$ jobs
[1]+  Running                 sleep 1m &
$ disown -h %1

技術メモへ戻る
メールの送信先:ひしだま