Image

Unixコマンドを使って文字列を出力するしてみる!正規表現を学ぼう!!

Unixコマンドや、正規表現の書き方についてまとめています。Unixコマンドの基礎知識について簡単に説明し、文字列を出力・編集するUnixコマンドについまとめています。

Unixコマンドで文字列を出力してみよう

前回は、Wgetを使ってクローリングをしました。

今回は、スクレイピングで使えるUnixコマンドについて解説します。前回ダウンロードしたファイルをスクレイピングするための事前準備です。

目次

01. Unixコマンドの基礎知識

_02. 標準ストリーム

_03. パイプ

04. テキスト処理のためのUnixコマンド

_05. catコマンド

_06. grapコマンド

_07. cutコマンド

_08. sedコマンド

09. 正規表現

10. まとめ

01. Unixコマンドの基礎知識   

データ処理をUnixコマンドを使って行うにあたって、重要な概念についてです。


_02. 標準ストリーム


コマンドの多くは、

入力されたデータを受け取る → 加工 → 出力

という流れで動きます。

コマンドが入力を受け取る元を標準入力、結果を出力する先を標準出力、エラーなどの補足情報を出力する先を標準エラー出力と言います。

この3つを総称したものが標準ストリームです。

デフォルトでは、標準入力はキーボードからの入力、標準出力、標準エラー出力はコンソール画面への表示となっています。

入力方法や出力方法は変更でき、それをリダイレクトと呼びます。


_03. パイプ


あるコマンドの標準出力を、他のコマンドの標準入力に渡すために使用するものがパイプと呼ばれるものです。

以下のコマンド例にある『(縦棒)』がパイプです。



$ cat example.csv | grap 例


パイプはいくつでもコマンドを繋げることが可能です。

04. テキスト処理のためのUnixコマンド

_05. catコマンド


catコマンドは、引数で与えたファイルを出力します



$ cat example.csv


_06. grapコマンド


grapコマンドは、引数で指定した文字列を含む行や引数として指定した正規表現にマッチする行を抜き出します

正規表現については後ほど説明します。

下のコマンド例では、『例』という文字列を含む行のみを出力します。



$ cat example.csv | grep 例


_07. cutコマンド


cutコマンドは、特定の文字で区切られたテキストの一部の列を抜き出します

下のコマンド例では、-dオプションで区切り文字、-fオプションで列の番号が指定されています。

『, (カンマ)』で区切った1列目と2列目のみを出力します。



$ cat example.csv | cut -d , -f 1,2


_08. sedコマンド


sedコマンドは、特定の条件にマッチする行を置き換えたり、削除したりします

引数に『 's/検索する正規表現/置換する文字/オプション' 』という文字列を与えると、正規表現にマッチする箇所を置換する文字列に置き換えて出力します。

下のコマンド例では、『, (カンマ)』をスペースに置き換えて出力します。

末尾にあるオプションgは、1行に検索する正規表現が複数回ある場合でも全て置き換えることを意味します。



$ cat example.csv | sed 's/,/ /g'


09. 正規表現

先ほど出てきた正規表現とは何なのか

正規表現とは、特定のパターンの文字列を表す文字列表現です

例えば、iPhoneとiPadについて正規表現を使って表すと、『 iP(hone|ad) 』となります。

( 』『 | 』『 ) 』は、パターンを表すために使用されるメタ文字と呼ばれる記号で、正規表現はこのメタ文字を使用して表します。


正規表現と単に行っても以下のようにさまざまな規格があります。

  • POSIXの基本正規表現(Basic Regular Expressions, BRE)
  • POSIXの拡張正規表現(Extended Regular Expressions, ERE)
  • Perlの正規表現

下に書いてあるものほど表現力が強く、さまざまなパターンを表現できます

grapやsedコマンドではデフォルトでPOSIXの基本正規表現を使うことができます。-EオプションをつけることでPOSIXの拡張正規表現も使えるようになります。

多くのプログラミング言語ではPerl互換の正規表現が実装されており、Pythonも例外ではありません。

よって、Perlの正規表現により近い拡張正規表現を主に使っていきます。

拡張正規表現とPerlの正規表現で共通している主なメタ文字について以下にまとめます。

基本正規表現だと、一部のパターンが使えなかったり、バックスラッシュが必要だったり少し違います


メタ文字説明
 .任意の1文字にマッチする
 例:a.c は aac, abc, acc などの文字列にマッチする
 [][]で囲まれた文字のいずれか1文字にマッチする
 例:a[bc]d は abd と acd にマッチし、他の文字列にはマッチしない
 []内の--で文字の範囲を表すことができる
 例:[0-9] は 0~9 の中のいずれか1文字にマッチする
 []内の^^を最初につけることで否定を表す
 例:[^abc] は a, b, c 以外の任意の1文字にマッチする
 ^行の先頭にマッチする
 例:^abc は 行頭にある abc にのみマッチする
 $行の末尾にマッチする
 例:xyz$ は 行末にある xyz にのみマッチする
 *直前のパターンを0回以上繰り返す
 例:ab*c は ac, abc, abbc, abbbc などの文字列にマッチする
 +直前のパターンを1回以上繰り返す
 例:ab+c は abc, abbc, abbbc などの文字列にマッチする
 ?直前のパターンを0回か1回繰り返す
 例:ab?c は ac または abc にマッチする
 {n}直前のパターンをちょうどn回繰り返す
 例:ab{3}c は abbbc にマッチする
 ()()で囲まれたパターンをグループかする
 例:(ab)+ は ab, abab, ababab などの文字列にマッチする
 ||で区切られたパターンのいずれかにマッチする
 例:a(bc|cd|de)f は abcf, acdf, adef にマッチする

拡張正規表現とPerlの正規表現に共通しているメタ文字とその使用例


10. まとめ


お疲れ様でした。

ここまで読んでいただきありがとうございました。

今回は、文字列を出力・編集するUnixコマンドや、正規表現の書き方についてまとめました。

Unixコマンドを使う際には、正規表現が必要になることがほとんどです。

よく使うものだけでも使い方を頭に入れておきましょう。