SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

業務でラクするためのUNIXテクニック集

cut、head、tail、sort・・・定番のフィルタコマンドを使いこなす!
~業務でラクするためのUNIXテクニック~

第3回 「並べ替え」編

  • X ポスト
  • このエントリーをはてなブックマークに追加

フィルタコマンドに関する便利な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コマンドは、ファイル中の表示可能な文字列を表示します。

※注4

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)の内容を表示しています。

まとめ

 今回は「ファイル内の文字検索・抜き出し・置換」に関するテクニックを紹介しました。また、今回紹介しきれなかった、sedawkperlを使えば、より複雑な文字列処理を行えます。次回以降、テーマごとにテクニックを紹介していく中で、順に紹介する予定です。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
業務でラクするためのUNIXテクニック集連載記事一覧

もっと読む

この記事の著者

保田和隆(ヤスダカズタカ)

Yasuda Kazutakaネットワーク関連の組み込みソフトウェア開発者。http://uguisu.skr.jp/Windows/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3643 2009/05/19 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング