Unixを便利にする道具

これは研究室の講習会のために作ったテキストに加筆訂正したものです。 Unixコマンドを使用例とともに紹介します。

lgrep - ゼミの日程ってどうなってたっけ?

% find ~/Mail -type f | xargs lgrep ゼミ
/home/foo/Mail/inbox/1: ゼミの日程を決めたいのですが。
/home/foo/Mail/inbox/4: ゼミの日程が決まりました。
findの主な機能
ファイル名、ディレクトリ名などを検索し、出力する。
xargsの主な機能
標準入力の各行を引数にしてコマンドを実行する。
lgrepの主な機能
指定されたファイルに対しての全文検索。 さまざまな文字コードに対応している。

lgrepはgrepの多言語対応版です。 grepにはegrep, fgrepなどの兄弟があります。

sort - ファイルを片付けて容量を減らしたい

% du ~/ | sort -nr | lv
107301  /home/foo
13527   /home/foo/Mail
8097    /home/foo/Mail/2005
duの主な機能
ディレクトリごとのディスク使用量を表示する。
sortの主な機能
行単位の並べ替え。 -n は数として扱うこと、 -r は逆順を意味する。
lvの主な機能
テキストビューワ。1ページごとに表示する。多言語対応。

screen - 実験用プログラムを動かしてから帰りたい

screen というプログラムを使います。 ターミナルの中に1つから複数のターミナルを作ることができます。

キーバインド

C-a C-c / C-a c
新しい仮想ターミナルを作る。
C-a C-a / C-a C-n / C-a n / C-a C-p / C-a p
仮想ターミナルの切り替え。
C-a a
仮想ターミナル内への C-a の入力。
C-a x
ロック。
C-a d
内部でプログラムを動かしながら、スクリーンを閉じる。 screen -r で再接続。

tail - 出力ファイルの様子を見たい

% ./foo > output.txt
(C-a c 等で別のターミナルへ)
% wc output.txt
      7      22     174 output.txt
% tail -f output.txt
aaa
bbb
wcの主な機能
ファイルの行数、単語数、文字数(Byte数)を出力する。
tailの主な機能
ファイルの後ろから10行を出力する。 -f オプションでファイルに何か追加されるごとに出力される。

関連するコマンドに head があります。

sh - 引数を変えながらプログラムを実行したい

シェルスクリプトの例

#!/bin/sh
for i in 1 2 3 4 5; do
    ./foo $i > out_$i.txt
done
#!/bin/sh
for i in 1 2 3 4 5; do
    output="out_$i.txt"
    if [ -f $output ]; then
        echo "$output: exists"
    else
        ./foo $i > $output
    fi
done

実行例

% chmod +x foo.sh
% ./foo.sh
% ls
foo        foo.sh*    out_1.txt  out_2.txt  out_3.txt  out_4.txt  out_5.txt

uniq - 出力ファイルの集計(1)

プログラムを実行して、次のような出力が得られたとする。 どんなパターンが何回出力されたかを集計する。

a
b
c
c
a
c

Perlスクリプト

#!/usr/local/bin/perl -w
%count = ();
while (<>) {
    chomp;
    $count{$_}++;
}
@k = sort {$count{$b} <=> $count{$a}} keys(%count);
foreach (@k) {
    print "$count{$_} $_\n"
}
%count
%で始まる変数はハッシュ(連想配列)。 添字として文字列をとる配列。
while (<>) {}
入力の各行についてのループ。 行は $_ に文字列形式で格納される。
chomp
改行コードを削除する組み込み関数。
$count{$_}
ハッシュの要素の使い方の例。
@k
@で始まる変数は配列。
sort
並べ替えの組み込み関数。 第1引数を省略すると文字コード順に並べる。
keys
ハッシュのキーからなる配列を作る組み込み関数。
foreach (@k) {}
配列の各要素についてのループ。

コマンドライン

% sort output.txt | uniq -c | sort -nr
      3 c
      2 a
      1 b
uniqの主な機能
同じ内容の行が1つ以上連続したとき、それを1つだけ出力。 -c でその行数を出力。

Perl - 出力ファイルの集計(2)

プログラムを実行して、次のような出力が得られたとする。 各行がパターンと得点だとして、パターンごとに得点を集計する。

a 3
b 1
c 2
c 2
a 1
c 6

Perlスクリプト

#!/usr/local/bin/perl -w
%count = ();
while (<>) {
    s/\n//;
    @_ = split;
    $count{$_[0]} += $_[1];
}
@k = sort {$count{$b} <=> $count{$a}} keys(%count);
foreach (@k) {
    print "$count{$_} $_\n"
}
s/\n//;
正規表現による置換。 この場合はchompと同じ動作になる。
split
スペースで単語に区切る組み込み関数。 どういう文字で区切るかを正規表現で指定できる。

実行例

% chmod +x foo.pl
% ./foo.pl output.txt
10 c
4 a
1 b

awk - 表の列の入れ替え

10 c
4 A
1 b

列の入れ替えはこんな感じ。

% awk '{print $2 " " $1}' output.txt
c 10
A 4
b 1

条件文も使える。

% awk '/[a-z]/{print $2 " " $1}' output.txt
c 10
b 1

課題

/DataBase/YOMIURI_EN/E2003.txt の1月1日の記事本文(T2タグ)で 使われている単語を、 頻度順に10単語、出現回数とともに抜き出しなさい。 過去形、複数形などで変化したものは別の単語とみなしてよい。

参考文献

Copyright© 1998-2006 Fuktommy. All Rights Reserved.
webmaster@fuktommy.com (Legal Notices)