フィルタコマンドに関する便利なUNIXテクニック例
最後に、コマンドやシェルの制御構造を利用したいくつかの例を紹介しておきます。業務に合わせて応用しながら使
ってください。
ディレクトリを「:(コロン)」で区切ってリストにする
「bin」という名前のディレクトリを「:
(コロン)」で区切ってリストにします。PATH環境変数を生成するのに役立ちます。
$ find / -name "bin" -type d | paste -s -d : -
隠しファイル(.ファイル)を含むディレクトリ・ファイルのサイズを出力する
ワイルドカードを利用することで、隠しファイルを含んだファイル・ディレクトリのサイズを昇順で出力しています。
$ du -cs * .[^\.]* | sort -n 4 .bashrc 8 .bash_profile 12 .emacs 1164 backup 1584 hoge 2772 total
「* .[^\.]*
」は、任意の複数文字のファイルと、「.
(ドット)」から始まる任意の複数文字のファイル名に展開されます。
ランダムな文字列を出力する
任意の長さの乱数を得たい場合に役に立ちます。次の例では6文字のランダムな文字列を出力しています。
$ strings /dev/urandom | grep -o [0-9a-zA-Z] | head -n 6 | paste -d '\0' -s -; echo ytiO0k
「/dev/urandom」は、乱数を生成する仮想デバイスです。strings
コマンドは、ファイル中の表示可能な文字列を表示します。
GNU strings 2.16(2005年)以前を使用すると、下記のような警告が出て正しい結果が得られないので、注意してください。
strings: Warning: '/dev/urandom' is not an ordinary file
IPアドレスをソートする
IPアドレスを、「.
(ドット)」で区切られた各組でソートした結果を出力します。
$ sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 /etc/hosts 127.0.0.1 localhost.localdomain localhost hoge 192.168.0.30 hoge.hoge.com
例えば「sort -n -k 1,1
」と指定すると、1列目を数値として順に並べ替えます。「/etc/hosts」は、ホスト名とIPアドレスの対応付け一覧が記述されたファイルです。
N行目からM行目を表示する
ファイル内の特定の区間の行だけを表示したい場合、head
コマンドとtail
コマンドを利用することができます。例えば、3行目~7行目だけを表示するには、次のように指定します。
$ seq 1 10 | head -7 | tail -n +3 3 4 5 6 7
単調増加(減少)する数値列を表示するseq
コマンドで1~10の数値列を出力し、head
コマンドとtail
コマンドで表示行を限定しています。
また、シェル関数を定義すると、次のようにも指定できます。
$ body () { N=$1; M=$2; tail -n +$1 | head -$((M-N+1)); } $ seq 1 10 | body 3 7 3 4 5 6 7
上の例では、「body N行目 M行目
」のような指定方法で結果を表示しています。なお、シェル関数の詳細な使い方に関しては、次回以降に説明します。
末尾N行を削除して表示する
次の例は、「1~10」の数値列から末尾5行(6~10)を削除して表示しています。
$ seq 1 10 | tail -r | tail +6 | tail -r 1 2 3 4 5
tail
コマンドの「-r
」オプションを2回利用しています。GNU tailのように「-r
」オプションが存在しない環境では、次のよう指定できます。
$ seq 1 10 | tac | tail -n +6 | tac
tac
コマンド(cat
コマンドの逆)は、ファイルの内容を行単位で逆に表示します。
メモリを多用しているプロセス順に表示する
$ ps aux | sort -n -k 4 | tail .... root 21269 0.0 1.0 9144 2728 ? Ss 09:37 0:00 sshd: root@notty root 11442 0.0 3.9 80108 10184 ? Sl Mar17 2:50 gnome-terminal root 346 0.1 8.7 28552 22300 pts/3 S Mar19 7:08 emacs
ps
コマンドは、プロセス識別子、端末名、CPU時間、コマンド名などを表示します。
C言語ソースコードのステップ数(行数)をカウントする
工数の見積もりに、ソースコードの行数を利用する場合に役立ちます。
$ find . \( -name "*.h" -o -name "*.c" \) -print0 | xargs -0 cat | wc -l 10311
例は、ヘッダファイル(.h)・ソースファイル(.c)合わせて10311行で構成されていることを意味しています。
なお、空白行を除いてカウントしたい場合は、次のように指定できます。
$ find . \( -name "*.h" -o -name "*.c" \) -print0 | xargs -0 grep . | wc -l 8582
find
コマンド、xargs
コマンドのオプションの詳細は第1回を参照ください。
よく利用するコマンドのリストを表示する
$ history | awk '{print $2}' | sort | uniq -c | sort -nr | head 112 ls 55 for 36 :> 29 rm 24 find
history
コマンドで得られるコマンド履歴を、整形して多用順に並び替えています。この例では、ls
コマンドを112回利用している事が分かります。awk
の詳細な使い方に関しては、次回以降に説明します。
アクセスログから、アクセス数の多いIPアドレス順に並べる
アクセス解析の際に役立つと思います。
$ cut -d ' ' -f1 access.log | sort | uniq -c | sort -nr | head -10 | nl 1 34375 210.XXX.86.4 2 20005 137.XXX.0.41 3 18489 137.XXX.0.42 4 17538 219.XXX.244.93 5 11252 222.XXX.237.24 ....
nl
コマンドは、行番号を付与します。
なお、Fedoraでは「/var/log/httpd/」以下に、Debianでは「/var/log/apache/」以下に、「access.log」「error.log」というApacheのアクセスログ、エラーログが保存されています。
アクセスログから、アクセスしたIPアドレスのホスト名一覧を取得する
$ for i in $(cut -d ' ' -f1 access.log | sort -u); { host $i; } 169.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-169.googlebot.com. 114.67.249.66.in-addr.arpa domain name pointer crawl-66-249-67-114.googlebot.com. .....
host
コマンドは、DNSサーバーで名前解決する情報について問い合わせをします。
特定のディレクトリにアクセスした IP アドレス一覧を表示する
gz形式で圧縮されたApacheログ(access.log.1.gz、access.log.2.gz・・・)から、「/blog」ディレクトリにアクセスしたIPアドレスを表示しています。
$ zcat access.log.*.gz | grep "/blog" | cut -d ' ' -f1 | sort -u 111.XX.9.82 122.XX.140.216 124.XXX.200.162 125.XXX.231.38 .....
この例では、zcat
コマンドを利用して、圧縮されたファイル(拡張子.gz)の内容を表示しています。
まとめ
今回は「ファイル内の文字検索・抜き出し・置換」に関するテクニックを紹介しました。また、今回紹介しきれなかった、sed
やawk
、perl
を使えば、より複雑な文字列処理を行えます。次回以降、テーマごとにテクニックを紹介していく中で、順に紹介する予定です。