情報リテラシー実習 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
© Copyright 2024 ExpyDoc