情報リテラシー実習 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$’ 結果はどうなりますか? $ 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. 指定した文字列を逆方向に検索 これは、現在カーソルがある場所以前について、特定の文字列のある場所にカーソルを持ってゆく機能です。 ?を入力し、探したい文字列を入力して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 cat: file2: そのようなファイルやディレクトリはありません 3 15 131 この例では,outfile1とoutfile2の内容が,3行,15単語, 131文字(バイト)であることを示しています。
パイプとフィルタリング データや信号などから必要なもののみを取り出したり,加工したりすることを一般にフィルタリングといい,その働きを持つもの(装置やプログラム等)をフィルタと呼びます。パイプ(|)はそのようなフィルタリングを行う際に威力を発揮します。 名前,年齢,及び電話番号のデータを集めたファイルmember.orgのデータを基に,並べ替え(sort)や重複の削除(uniq)コマンドを施しフィルタリングを行う例を下記に示します。パイプで接続していくことによってデータが整形されていく様子がわかります。なお,uniq コマンドは隣り合う行で重複があればそれを解消するコマンドですので,利用の際にはデータがソートされている必要があります。
パイプとフィルタリング $ cat member.org yoshiyama 23 096-123-4567 yoshikawa 22 096-234-5678 igarashi 24 096-345-6789 shinjyou 9 096-012-3456 arashiyama 21 096-111-1111 $ cat member.org | sort igarashi 24 096-345-6789 shinjyou 9 096-012-3456
パイプとフィルタリング $ 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'
パイプとフィルタリング 下記の例では,年齢(の若い)順に並べ替えています。-k 2は2番目のフィールドをキーとして 下記の例では,行数を数えることで人数(この場合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 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 igarashi 24 096-345-6789 shinjyou 9 096-012-3456 下記はheadやtailコマンドを使ってファイルの先頭や末尾を表示する例です。 head -3 member.org の形式で使用することもできます。 $ cat member.org | head -3 $ cat member.org | tail -3 shinjyou 9 096-012-3456