Jump to content 日本-日本語

製品  >  ソフトウェア  >  HP-UX   >  Knowledge-on-Demand  >  UNIXの教科書 応用編

UNIXの教科書 応用編
〜はじめよう! WindowsとLinuxからのステップアップ〜

第1日目:grepコマンドと正規表現

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む
第1日目:grepコマンドと正規表現
いよいよ「UNIXの教科書」応用編が始まります。シェルのより高度な利用方法に入っていきますが、基礎編で学んだことを踏まえて着実に一歩ずつ進んでいきましょう。初回となる今月はgrepコマンドと、grepコマンドを使いこなすために必須となる正規表現を取り上げます。grepコマンドはテキストファイルから指定した文字列を含む行を取り出すのが基本的な使い方です。正規表現と組み合わせればさまざまなテキスト処理が可能になります。
UNIXの教科書 応用編〜はじめよう! WindowsとLinuxからのステップアップ〜 1日目
grepコマンドの基本的な使い方
正規表現の基礎を知る
2008年8月
大津 真

UNIXの教科書:登場人物紹介 このリンクをクリックすると、新しいウィンドウが開きます

マリー先生
マリー先生:
さあ、UNIXの教科書も今回から応用編ということで、ちょっと難しく感じるかもしれないけどがんばりましょう。みんな、基礎編の内容をもう一度復習しておいてね。それはそうと、期末試験の結果はどうだったかな?
タックス君:
僕は90点で合格でした! 第6問がどうしてもわからないのですが…。
タックス君
マリー先生
マリー先生:
この問題ね。

第6問: カレントディレクトリの下のReadme.txtファイルのシンボリックリンクを、カレントディレクトリの下のtestディレクトリにlink.txtという名前で作成するコマンドはどれか?
a) ln -s ../Readme.txt test/link.txt
b) ln -s Readme.txt test/link.txt
c) ln ../Readme.txt test/link.txt
d) ln Readme.txt test/link.txt
タックス君:
カレントディレクトリの下のファイル「Readme.txt」のシンボリックリンクを作成するわけだから、答えはbだと思うのですが、不正解だったんです。
タックス君
マリー先生
マリー先生:
勘違いしやすい点だけど、シンボリックリンクは単にリンク先のパスを格納しているだけなの。従って、もとのファイルを相対パスで指定する場合、カレントディレクトリではなくシンボリックリンクを起点にした相対パスで指定する必要があるわけ。つまり、「test/link.txt」を起点にして見ると「Readme.txt」のパスは「../Readme.txt」となるから、答えはaになるの。図1を見て理解してね。
シンボリックファイルから見たリンク先のパスが格納される
図1:シンボリックファイルから見たリンク先のパスが格納される
四色君:
僕は、1回目は60点でした。気を取りなしてもう1回チャレンジしたら、次はなんとか80点! 第6問の他に、第10問がわかりませんでした。
四色君
マリー先生
マリー先生:
第10問は、文字の置換に使用されるtrコマンドの問題ね。

第10問: テキストファイル「sample.txt」内の文字「,」をすべて「:」に置換し、新たにnew.txtファイルに保存するコマンドとして、正しくないのはどれか?
a) tr "," ":" < sample.txt > new.txt
b) tr "," ":" sample.txt > new.txt
c) cat sample.txt | tr "," ":" > new.txt
d) tr "," ":" < sample.txt | cat > new.txt

trはちょっと特殊なコマンドで、引数に処理するファイルのパスを指定できないの。だから標準入力のリダイレクションでファイルのデータを取りこむ(aとdのコマンド)か、パイプでデータを渡す(cのコマンド)必要があるわけ。したがって、「sample.txt」を引数にしているbが正しくないコマンドということになるのね。

今日の時間割 grepコマンドの基本的な使い方 正規表現の基礎を知る 練習問題

1時間目:grepコマンドの基本的な使い方

UNIXにはテキストを処理するコマンドが多数用意されています。基礎編でも、テキストファイルの中身を表示するcatや、文字を置換するtrコマンドなど、さまざまなテキストコマンドを使ってきました。今回はちょっと高度なテキスト処理コマンドとして、テキストファイルから指定した文字列を含む行を取り出す「grep」コマンドを紹介しましょう。なお、grepコマンドは「正規表現」と呼ばれる特別な表記法を使って目的の文字列を指定できます。正規表現については2時間目に説明することにして、まずこの時間では、grepコマンドの基本的な使い方について説明しましょう。

ファイルから指定した文字列を含む行を取り出す

grepコマンドを使用してファイルから指定した文字列を含む行を取り出す場合の、もっとも基本的な書式を示します。

grep 文字列 ファイルのパス

最初の引数に目的の文字列を、2番目の引数に対象となるテキストファイルのパスを指定するわけです。

例として、次のような内容のテキストファイル「mail.txt」があるとしましょう。このファイルには、各行に1組ずつ、名前、メールアドレス、年齢がカンマ「,」で区切られて格納されています。

makoto otsu,mako@example.com,41
yamada taro,taroy@example.com,33
oyamada hana,oyama33@example.jp,44
kataoka ichiro,k-ichi@example.com,43
oka hanako,hana41@example.com,51

このファイルから文字列「makoto」を含む行をとりだすには、次のようにします。

$ grep makoto mail.txt  【Enter】
makoto otsu,makoto@example.com,41

また、文字列「33」を含む行を取り出すには次のようにします。

$ grep 33 mail.txt  【Enter】
yamada taro,taroy@example.com,33
oyamada hana,oyama33@example.jp,44

四色君:
「yamada taro」のような途中にスペースを含む文字列を指定するにはどうすればよいのですか?
四色君
マリー先生
マリー先生:
引数全体をダブルクォーテーション「"」(もしくはシングルクォーテーション「'」)で囲うの。具体的には、次のようになるわ。

$ grep "yamada taro" mail.txt 【Enter】
yamada taro,taroy@example.com,33

それから、引数の中に「*」や「?」といったワイルドカードを文字そのものとして含めたときにも、それがシェルによって展開されないようにダブルクォーテーション「"」で囲む必要があるの。いつも引数をダブルクォーテーション「"」で囲むように習慣づけておいてもいいわね。
ダブルクォーテーション「"」で囲むかわりに、スペースの前に「\」を付けてもいいわよ。

$ grep yamada\ taro mail.txt 【Enter】
yamada taro,taroy@example.com,33
タックス君:
あれ? 「\」って、コマンドラインが複数行にわたるときにも使いましたよね?
タックス君
マリー先生
マリー先生:
そうね。コマンドラインの行末で「\ 【Enter】」とすると、コマンドラインが次の行に継続することを表すの。

$ grep taro \
> mail.txt 【Enter】
yamada taro,taroy@example.com,33

それに対して、引数の途中で「\」を使った場合にはその後ろの特殊文字を、文字そのものとして扱うの。シェルにとってスペースは引数の区切り文字なのだけど、前に「\」を付けることによって「スペース」という文字として扱うわけ。このように「\」で後ろの特殊文字の機能を失わせることを「エスケープする」というの。
別の例として、ダブルクォーテーション「"」で囲まれた文字列の中で、ダブルクォーテーション「"」を文字そのものとして扱いたければ、その前に「\」を付けるの。

$ echo "hallo \"HP-UX\"" 【Enter】
hallo "HP-UX"

あるいは、「\」を使わずに全体をシングルクォーテーション「'」で囲ってもいいわよ。

$ echo 'hallo "HP-UX"' 【Enter】
hallo "HP-UX"

文字列を含まない行を取り出す

逆にgrepコマンドを使用して、ファイルから指定した文字列を含まない行を取り出すには、次の形式で実行します。

grep -v 文字列 ファイルのパス

たとえば、mail.txtから「44」という文字列を含まない行を取り出すには次のようにします。

$ grep -v 44 mail.txt  【Enter】
makoto otsu,mako@example.com,41  
yamada taro,taroy@example.com,33
kataoka ichiro,k-ichi@example.com,43
oka hanako,hana41@example.com,51

いずれかの文字列に一致する行を取り出す

引数に複数の文字列を指定して、そのいずれかに一致する行を取り出すこともできます。その場合、次の書式で実行します。

grep -e 文字列1 -e 文字列2 ... ファイルのパス

つまり、「-e 文字列」オプションを必要な数だけ指定すればよいわけです。たとえば、mail.txtから「41」と「44」のどちらかの文字列を含む行を取り出すには、次のようにします。

$ grep -e 41 -e 44 mail.txt 【Enter】
makoto otsu,makoto@example.com,41
oyamada hana,oyama33@example.jp,44
oka hanako,hana41@example.com

四色君:
最初の例の「grep makoto mail.txt」を、「grep -e makoto mail.txt」とすることもできるのですか?
四色君
マリー先生
マリー先生:
それでもかまわないわ。実際には、文字列が1つのときは「-e」を省略できるわけ。
タックス君:
行番号を表示するには、「cat -n」コマンドとパイプで組み合わせて次のようにすればよいのですね。

$ cat -n mail.txt | grep 41 【Enter】
1  makoto otsu,mako@example.com,41  
5  oka hanako,hana41@example.com,51
タックス君
マリー先生
マリー先生:
もちろんそれでもいいけど、grepコマンド自体にも行番号を表示する「-n」オプションがあるので、「cat -n」コマンドと組み合わせなくても行番号を表示できるわよ。

$ grep -n 41 mail.txt 【Enter】
1:makoto otsu,makoto@example.com,41  
5:oka hanako,hana41@example.com

指定した複数の文字列を含む行を取り出す

複数の文字列を指定して、それらをすべて含む行を取り出したい場合にはどうすればよいでしょうか? 残念ながら、grepには指定したすべての文字を含む行を取り出すといったオプションは用意されていません。ただし、grepは引数にファイルを指定しないと入力を標準入力から読み込むように作られています。したがって、コマンドの標準出力と標準入力を結びつけるパイプ機能を使って、2つのgrepコマンドを結びつけてやればいいわけです。

たとえば、mail.txtから文字列「44」と「33」の両方を含む行を取り出すには次のようにします。

$ grep 44 mail.txt | grep 33 【Enter】
oyamada hana,oyama33@example.jp,44

タックス君:
複数のファイルから指定した文字列を含む行を取り出すことはできますか?
タックス君
マリー先生
マリー先生:
grepコマンドの最後の引数にファイルのパスを並べて記述すればOKよ。このとき結果をわかりやすくするために、先頭にファイル名を表示してくれるの。たとえば、mail.txtとmail2.txtから文字列「44」を含む行を取り出すには、次のようにするの。

$ grep 44 mail.txt mail2.txt 【Enter】
mail.txt:oyamada hana,oyama33@example.jp,44
mail2.txt:sakurai taro,ss10@example.com,44
mail2.txt:nakata saburo,nsabu1@example.com,44

休み時間:CDEの仮想デスクトップ

HPの標準デスクトップ環境であるCDEには、初期状態で4つの仮想的なデスクトップ画面が用意されています。個々の仮想デスクトップのことを「ワークスペース」と呼びます。これらは、パネル中央の「1」「2」「3」「4」ボタンで切り替えることができます。

ワークスペースの切り替えボタン
図2:ワークスペースの切り替えボタン

なお、ワークススペースの数を増やすには、ボタンの上を右クリックし、表示されるメニューから「ワークスペースの追加」を選択します。
また、「1」「2」「3」「4」のワークスペース名を任意のワークスペース名に変更することもできます。

連載記事一覧 1  |  2 次のページへ

本ページの内容は執筆時の情報に基づいており、異なる場合があります。

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

オンラインサポート
製品の標準保証でご利用いただける無償のサービスです。

ショールーム

ショールーム 導入をご検討のお客様へ
業務アプリケーションの継続・標準化・開発性とシステム担当者様、システム開発者様が抱える悩み・疑問に対する解決策実体験して頂けます。
印刷用画面へ
プライバシー ご利用条件・免責事項