eil2009070607

情報リテラシー実習
Exercise in Information Literacy
ちょっと賢い使いかた
§15 知っていると便利なコマンド
§32 正規表現
§33 検索と置換
§35 フィルタのテクニック
知っていると便利なコマンド〜ファイルの操作〜
•
•
•
•
cmp [compare]:2つのファイルが1文字(バイト)ずつ同じ内容かどうかを調べ,
一致していなければ,異なる箇所のバイト位置と行番号を表示する。
$ cmp file1 file2
diff [difference]:2つのテキストファイルの異なる部分を調べる。
$ diff file1 file2
– 出力の1行目:異なる箇所の行番号とどのような違いかを表示
– file1の該当する行番号 [c/a/d] file2の該当する行番号
• c:change(変更)
• a:append(追加)
• d:delete(削除)
– 出力の2行目以降:2つのテキストファイルの異なる行を表示
• 行頭に「<」:第一引数のファイルの行
• 行頭に「>」:第二引数のファイルの行
知っていると便利なコマンド〜ディスクの使用量と要領〜
•
•
du [disk usage]:自分が所有しているファイルやディレクトリの総容量を調べる
$ du [-option] [dirname]
– 出力結果には,ディレクトリ名[dirname](指定しなければ,カレントワーキン
グディレクトリ)の子ディレクトリ毎のブロック数が表示され,最終行に総容量
が表示される
– オプション[-option]
• -k:1ブロック=1024バイト(1kバイト)
• -s:総容量のみを表示
•
•
•
df [disk free]:ディクスの残りの容量を調べる
$ df
大学の計算機システムはたくさんの人が共同で使用しています。自分の使用し
ているディスク容量には常に気を配りましょう。
知っていると便利なコマンド〜ファイルの一部取り出し〜
• wc [word count]:ファイルの行数を表示
• $ wc [-option] filename
– 出力は,「ファイルの行数」「単語数」「文字数」
– オプション[-option]
• -l:行(line)数だけ表示
• -w:単語(word)数だけ表示
• -c:文字(character)数だけ表示
知っていると便利なコマンド〜ファイルの一部取り出し〜
•データの先頭一部分,あるいは末尾の一部分を取り出して,
標準出力に出力
•headコマンド
•$ head -n 行数 ファイル
–ファイルの先頭行を指定行分表示(デフォルトは10行)
•tailコマンド
•$ tail -n 行数 ファイル
–ファイルの末尾行を指定行分表示(デフォルトは10行)
•ファイルの一部分だけを表示することができるが,本当に表示したい部分
を正確に指定するのは難しい.
5
正規表現
正規表現とは
とても便利な「文字列のとらえ方」の手法→
ある規則に基づいて文字列(記号列)の集合を表す方法。
文字列を簡潔に表現することができる。
例:
^a.*tion$ を解釈してみると,
行の先頭(^)に「a」があり,
任意の一文字(.)の0回以上の繰り返し(*)があり,
「t」「i」「o」「n」と文字が続いて,
そこで行の終わり($)がある文字列。
grep 系の正規表現
grep(global regular expression printer) : ファイルに対し、
正規表現を使ってパターンマッチングを行い、マッチする
行を出力する。正規表現でパターン作る際に利用する記
号をメタ文キャラクタ(meta characters)という。
^ :行の先頭。
$ :行の終わり。
. :任意の一文字。
[ ] : かっこ。括弧内に含まれる一文字。
* :一文字に続く“*” は0 回以上の表現の繰り返し。
\ メタの意味をなくし,その文字自身を表す。
例えば,\$。
例題(正規表現)
$ look . | grep ‘^a.*tion$’
結果はどうなりますか?
(look : 英単語のつづりを調べる)
(grep:ファイルに対してパターンマッチングを行い、マッチする行
を出力する。)
$ find . –name ‘*.0’ -print
結果はどうなりますか?
(find : 条件を指定することによって、ファイルやディレクトリを検
索するなどで,正規表現を用いて検索が可能。)
検索と置換
vi : 編集エディタ
emacs : 編集エディタ
grep : ファイルに対してパターンマッチングを行い、マッチする行を
出力する。
egrep : grep -E とほぼ同じで、指定した検索パターンは拡張正規
表現として扱われる。
fgrep : grep -F と全く同じである。指定した検索パターンは正規表
現ではなく、普通の文字列として扱われる。
less :ファイル表示プログラム。
find :条件を指定することによって、ファイルやディレクトリを検索
するなどで,正規表現を用いて検索が可能。
emacs での検索と置換
1.文字列の検索について
emacsにおいて、特定の文字列を探すには、次のようなコマンドを使います。
下方向に検索:C-s (Ctrl+sの意味)
上方向に検索:C-r
C-sとC-rは検索方向が違うだけで、使い方は同じです。C-sを入力すると、
emacsの一番下にウィンドウ(エコー領域と言います。)が現れ、”I-search:”と
いう表示が出てきますので、その後に検索したい文字列を入力してください。
検索したい文字列までカーソルが移動します。
また、C-sやC-rでは検索文字列を1文字増やすごとに一致する文字列の検
索が行われます。ここがviとは違います。このような検索機能をインクリメンタ
ルサーチ(incremental search )といいます。
目的の文字列が見つかったらEnterキーを押して検索を終了します。
emacs での検索と置換
2. 文字列の置換について
文章中の文字列全てを一括変換することができます。
M-x replace-string [Enter] 置換対象文字列 [Enter] with 置換する文字列
(M はESCキー。また下線のついた文字はエコー領域に自動的に表示されます。)
一括変換が不安な人は、一つ一つ置換するかどうか聞いてくる
次のコマンドがよろしいでしょう。
M-% Query replace: 置換対象文字列 [Enter] with 置換文字列 [Enter]
この後、エコー領域にプロンプトが表示されますが, y と入力すると置換し、
次の文字列を検索する。n と入力すると置換は行われずに
次の文字列を検索する。qでコマンドを終了する。
viの検索・置換機能
1. 指定した文字列を順方向に検索
これは、現在カーソルがある場所以降について、特定の文字列のある場所
にカーソルを持ってゆく機能です。
$ vi sample.txt ←sample.txtは任意のテキストファイルです。
/ を入力し、探したい文字列を入力してEnterキーを押します。
同じ文字を次々に検索するにはn で同じ検索文字列を再検索します。
また、Nで検索方向と反対方向に検索します。
2. 指定した文字列を逆方向に検索
これは、現在カーソルがある場所以前について、特定の文字列のある場所
にカーソルを持ってゆく機能です。
$ vi sample.txt ←sample.txtは任意のテキストファイルです。
?を入力し、探したい文字列を入力してEnterキーを押します。
viの検索・置換機能
3. viのexコマンドを用いた文字列変換
viのコマンドモードで : を入力するとexモードになり、exコマンド
を入力することができます。exコマンドは多くのコマンドを覚
える必要があるのですが、ここでは一部のみ扱います。
:行アドレス 指定した行にジャンプする
:行アドレスd 指定した行を削除する
:行アドレスco行番号 行アドレスに指定した行を、指定した行番
号にコピーする
:行アドレスm行番号行アドレスに指定した行を、指定した行番
号に移動する。
:行アドレスs/検索文字列/置換文字列 検索文字列を置換文字
列に置き換える
フィルタ
フィルタとは
標準入力から入力したデータを加工して,その結果を
標準出力に出力するようなプログラム。
大きく2つに分類できる。
1. フィルタ自身にプログラムを与えて,フィルタ機能を
指定できるもの
2. はじめから機能が決まっているものパイプというプロ
セス間で通信を行うための機構でつないで,より高度
なフィルタ機能を実現できる。
パイプとフィルタリング
UNIXではパイプという機能があります。
これは,コマンドの出力結果を次のコマンドに引
き渡し,次々と処理を行っていく場合に使用され
ます。コマンドとコマンドとの間にパイプを設けて
データ(出力結果)を流し込んでいくようなイメー
ジで捉えてください。
パイプは,縦棒 | の記号を用いて,
command1 | command2
のような形式で使用します。
パイプとフィルタリング
$ cat outfile1 outfile2 | wc
では,outfile1とoutfile2の内容をcatコマンドで表示し,その内容をwc
コマンドに送り込むことによって,行数,単語数,文字数(バイト数)を
調べています。その実行例を下記に示します。
$ cat outfile1
2009年 7月 3日 金曜日 12:27:22 JST
$ cat outfile2
2009年 7月 3日 金曜日 12:27:22 JST
cat: file2: そのようなファイルやディレクトリはありません
$ cat outfile1 outfile2 | wc
3 15 131
この例では,outfile1とoutfile2の内容が,3行,15単語,
131文字(バイト)であることを示しています。
パイプとフィルタリング
• データや信号などから必要なもののみを取り出したり,加工
したりすることを一般にフィルタリングといい,その働きを持
つもの(装置やプログラム等)をフィルタと呼びます。パイプ
(|)はそのようなフィルタリングを行う際に威力を発揮します。
• 名前,年齢,及び電話番号のデータを集めたファイル
member.orgのデータを基に,並べ替え(sort)や重複の削除
(uniq)コマンドを施しフィルタリングを行う例を下記に示しま
す。パイプで接続していくことによってデータが整形されてい
く様子がわかります。なお,uniq コマンドは隣り合う行で重複
があればそれを解消するコマンドですので,利用の際には
データがソートされている必要があります。
パイプとフィルタリング
$ cat member.org
yoshiyama
23
yoshikawa
22
igarashi
24
shinjyou
9
yoshiyama
23
arashiyama 21
096-123-4567
096-234-5678
096-345-6789
096-012-3456
096-123-4567
096-111-1111
$ cat member.org | sort
arashiyama 21 096-111-1111
igarashi
24
096-345-6789
shinjyou
9
096-012-3456
yoshikawa
22 096-234-5678
yoshiyama
23 096-123-4567
yoshiyama
23
096-123-4567
パイプとフィルタリング
$ cat member.org | sort | uniq
arashiyama 21 096-111-1111
igarashi
24 096-345-6789
shinjyou
9
096-012-3456
yoshikawa
22 096-234-5678
yoshiyama
23 096-123-4567
下記の例では,さらにyoshi を含む行のみを抜き出しています。
grepは指定した文字列を検索し,それを含む行を表示するコマンドです。
$ cat member.org | sort | uniq | grep 'yoshi'
yoshikawa
22 096-234-5678
yoshiyama
23 096-123-4567
パイプとフィルタリング
下記の例では,行数を数えることで人数(この場合5名)を割り出しています。
$ cat member.org | sort | uniq | wc -l
5
下記の例では,年齢(の若い)順に並べ替えています。-k 2は2番目のフィールドをキーとして
並べ替えを行うことを意味します。(例のmember.orgのようなデータファイルでは,
列をフィールド,行をレコードと呼びます。)フィールドを指定しない場合は1番目すなわち1を
指定することと同じになります。また,-nは文字の並びとしてではなく数値として解釈して並べ
替えを行うことを意味しています。-nを指定しない場合は文字として比較が行われますので,
結果が異なります。特に文字として比較が行われる場合には空白などの存在が微妙に
関係してきますので,詳細についてはマニュアルを参照してください。
$ cat member.org | sort -n -k 2
shinjyou
9
096-012-3456
arashiyama 21
096-111-1111
yoshikawa
22 096-234-5678
yoshiyama
23
096-123-4567
yoshiyama
23
096-123-4567
igarashi
24 096-345-6789
パイプとフィルタリング
$ cat member.org | sort -k 2
arashiyama 21 096-111-1111
yoshikawa
22 096-234-5678
yoshiyama
23
096-123-4567
yoshiyama
23
096-123-4567
igarashi
24 096-345-6789
shinjyou
9
096-012-3456
下記はheadやtailコマンドを使ってファイルの先頭や末尾を表示する例です。
head -3 member.org の形式で使用することもできます。
$ cat member.org | head -3
yoshiyama
23
096-123-4567
yoshikawa
22 096-234-5678
igarashi
24 096-345-6789
$ cat member.org | tail -3
shinjyou
9
096-012-3456
yoshiyama
23
096-123-4567
arashiyama 21 096-111-1111