第7回 grepと制御構造2 2重ループ その2

本日覚えること

Linux
(1) grep(ファイル等からの文字列の検索)
(2) パイプ (|)

(3)while ループを2重に使っている

その他、
コマンドのオプション
「-」を使う、HTMLマニュアルをつかう。

前回の復習

Linux
(1) > リダイレクト (画面出力をファイルに記録)
(2) catコマンド (ファイルの内容を画面にだすコマンド)
C言語
(3) while ループ (繰り返しの文)

前準備

  • w3mのインストール

(1)w3mcygwinにうって反応を確認.そんなコマンドがない的なエラーがでたら以下をする
(2)cygwinのsetup.exeがw3mをインストール: cygwinのsetup.exeの起動-> OK->OKとしていき-> ソフト選ぶところ->webの横の「+」クリック->出てくるメニューからw3mを選び「install」に

  • サンプルデータの作成

サンプルファイル(http://abbbbb.hatenablog.com/entry/2014/07/23/235540
mos.txtで保存.
具体的には,
(1)上記のサンプルファイルのあるブログページのサクラエディタを起動してコピー&ペースト
(2)UTF-8mos.txtとして,これまで使っていたプログラミングよりのフォルダへ保存

grepの使い方

  • grep は単語を検索するコマンド

その単語が存在する行を表示する.
つかい方の基本は2つ

(1)ファイルから

grep 単語 ファイル名

例:

grep うまい mos.txt

(2)コマンドの出力結果をフィルタリング(パイプの利用)

コマンド | grep 単語

「|」はパイプと呼ばれる(後で説明)
例:

ls | grep .c 

(1)まず、ファイルからの例

例えば,

grep うまい mos.txt

出力結果

あの玉葱がうまいと思うんだけど
かなり久々に食べたけどナゲットもうまいよね
うまいとかいってる奴に騙されるなよ
普通のチーズモスのが何倍もうまいから
リッチのゴルゴンゾラチーズうまいのか
まあうまいのだが

grep まずい mos.txt

出力結果

コーンはまずい。甘すぎる。照焼きで甘いのにさらにコーンが激甘。
単にゴルゴンゾーラチーズがすっぱすぎてまずいだけなのかもしれないが

前後-nオプションをつければ,前後n行を表示することができる
前後3行だと-3をつける.

grep -3 まずい mos.txt

出力

$ grep -3 まずい mos.txt
とびきりチーズと交互に食べたいわ

105 :やめられない名無しさん:2014/04/03(木) 01:08:42.75 id:nBMe95uK
コーンはまずい。甘すぎる。照焼きで甘いのにさらにコーンが激甘。
リッチチーズはモスチーズ増量で感じなので普通に美味い。

106 :やめられない名無しさん:2014/04/03(木) 02:39:10.81 id:w1aXfwrG

  • -

広告に割引クーポンついていたので
リッチモスチーズ食べたけど期待はずれだった
絶妙に完成されていた味に少しでもアレンジを加えただけで崩壊してしまった感じ
単にゴルゴンゾーラチーズがすっぱすぎてまずいだけなのかもしれないが

164 :やめられない名無しさん:2014/04/07(月) 07:14:51.79 id:zC9pIVZc
とびきりハンバーグサンドもなんとなくゲロっぽい酸味で嫌いなんだけど

grep テリヤキ mos.txt

なんで普通のテリヤキは菜摘にならないんだよ
菜摘テリヤキなんて8割以上レタスじゃん
モスバーガーとテリヤキバーガーも菜摘にしてくれよ
テリヤキはテリヤキチキンの菜摘はあるから大丈夫じゃないかな
4月からモスチーズ買えますテリヤキ冒険しますってサイトに出てるけど
ベジテリヤキ、ベジジュエル食べてきた
でも食ってみると、レタスの食感とテリヤキソースの味が支配的、ちょっとだけ、コーンと揚げ物の味もする
ベジテリヤキ微妙だなぁ
コーンのテリヤキは娘のを一口強奪しただけだが、マヨネーズとコーンが俺には合ってないように思えた。
リッチチーズとテリヤキコーン食べた
テリヤキコーンは食う価値ある。以上だ。
テリヤキコーンは期待してなかったがまったく違和感が無い位に合ってた
これには驚いたがテリヤキソースの味が通常より薄く感じるのが残念かな
テリヤキコーン

特定のユーザーの発言数を調べる。

$ grep Eoy8GfIj mos.txt
141 :やめられない名無しさん:2014/04/06(日) 00:04:18.23 id:Eoy8GfIj
144 :やめられない名無しさん:2014/04/06(日) 00:23:43.28 id:Eoy8GfIj
153 :やめられない名無しさん:2014/04/06(日) 11:17:23.57 id:Eoy8GfIj
158 :やめられない名無しさん:2014/04/06(日) 20:08:00.74 id:Eoy8GfIj

user1@panasonic ~
$ grep p0aqfeKl mos.txt
136 :やめられない名無しさん:2014/04/05(土) 23:29:37.54 id:p0aqfeKl
138 :やめられない名無しさん:2014/04/05(土) 23:38:56.19 id:p0aqfeKl
140 :やめられない名無しさん:2014/04/05(土) 23:50:31.24 id:p0aqfeKl

Eoy8GfIjさんがどんな発言しているか 「-3」オプションで,前後3行をみて調べている.

grep -3 p0aqfeKl mos.txt
テリヤキコーンは期待してなかったがまったく違和感が無い位に合ってた
これには驚いたがテリヤキソースの味が通常より薄く感じるのが残念かな

136 :やめられない名無しさん:2014/04/05(土) 23:29:37.54 id:p0aqfeKl
どっちも美味しかったけど
リッチチーズの方は豊かな味わいで大人向けの味になっている
マックのとかの濃い味のチーズが好きな人には物足りないかもしれん

  • -

137 :やめられない名無しさん:2014/04/05(土) 23:34:07.64 ID:qs+Hk82D
十分濃いって

138 :やめられない名無しさん:2014/04/05(土) 23:38:56.19 id:p0aqfeKl
だから「マックの濃さ」と言い置いてるだろw

139 :やめられない名無しさん:2014/04/05(土) 23:43:23.43 ID:qs+Hk82D

  • -

ココノニンシキノチガイダナ

140 :やめられない名無しさん:2014/04/05(土) 23:50:31.24 id:p0aqfeKl
いや不等号で表されるもんじゃなくて濃さの種類の違いだ
そのニュアンスが伝わらないなら平行線だな

Eoy8GfIjさん

$ grep -3 Eoy8GfIj mos.txt
いや不等号で表されるもんじゃなくて濃さの種類の違いだ
そのニュアンスが伝わらないなら平行線だな

141 :やめられない名無しさん:2014/04/06(日) 00:04:18.23 id:Eoy8GfIj
モスバーガーは基本的に作り置きはしないの?

142 :やめられない名無しさん:2014/04/06(日) 00:07:00.47 id:dkWEZgYc

  • -

いんふぉが~w

144 :やめられない名無しさん:2014/04/06(日) 00:23:43.28 id:Eoy8GfIj
>>142
やはりそうですよね
プライドポテトのまさに挙げたて感とかは作り置きでは無理でしょう

  • -

>>143
インフォガーゴキブリ 完 全 敗 北 死 亡 ♪wwwっwwwっw

153 :やめられない名無しさん:2014/04/06(日) 11:17:23.57 id:Eoy8GfIj
マックは自爆みたいなもんでしょ?
モスもそうならなければいいけど

  • -

マックみたいに、微妙の厚さのヒーターにいれるとかじゃない

158 :やめられない名無しさん:2014/04/06(日) 20:08:00.74 id:Eoy8GfIj
>>157
ハンズをフライパンで軽く焼いてるかと思ってたよ

  • パイプ

いちいちファイルに落とすのはめんどくさい。
ファイルをに落とさず、grepをかけたい。
その場合は,

ls

この表示に出力した結果をそのままgrepに送ることができる.
「コマンド1 | コマンド2 」の記号をつかう.コマンド1の結果をコマンド2におくる.
「|」をパイプという.

ls | grep .c
#lsのした結果に対して,「.c」の部分だけぬきだす
#lsの出力にフィルターをかけてるイメージ(ls の結果のうち.cだけを通す)

ls

ls | grep .txt

grep テリヤキ mos.txt

出力

なんで普通のテリヤキは菜摘にならないんだよ
菜摘テリヤキなんて8割以上レタスじゃん
モスバーガーとテリヤキバーガーも菜摘にしてくれよ
テリヤキはテリヤキチキンの菜摘はあるから大丈夫じゃないかな
4月からモスチーズ買えますテリヤキ冒険しますってサイトに出てるけど
ベジテリヤキ、ベジジュエル食べてきた
でも食ってみると、レタスの食感とテリヤキソースの味が支配的、ちょっとだけ、コーンと揚げ物の味もする
ベジテリヤキ微妙だなぁ
コーンのテリヤキは娘のを一口強奪しただけだが、マヨネーズとコーンが俺には合ってないように思えた。
リッチチーズとテリヤキコーン食べた
テリヤキコーンは食う価値ある。以上だ。
テリヤキコーンは期待してなかったがまったく違和感が無い位に合ってた
これには驚いたがテリヤキソースの味が通常より薄く感じるのが残念かな
テリヤキコーン

ここからさらにコーンだけをとりだす.

grep テリヤキ mos.txt | grep コーン
mos.txt とテリヤキを含むものを表示
#その結果のうちコーンのものをとりだし.

コーン以外の話題をとりだす.
除くは「grep -v」

grep テリヤキ mos.txt | grep -v コーン
mos.txt とテリヤキを含むものを表示
#その結果のうちコーンのものをとりだし.

結果

なんで普通のテリヤキは菜摘にならないんだよ
菜摘テリヤキなんて8割以上レタスじゃん
モスバーガーとテリヤキバーガーも菜摘にしてくれよ
テリヤキはテリヤキチキンの菜摘はあるから大丈夫じゃないかな
4月からモスチーズ買えますテリヤキ冒険しますってサイトに出てるけど
ベジテリヤキ、ベジジュエル食べてきた
ベジテリヤキ微妙だなぁ
これには驚いたがテリヤキソースの味が通常より薄く感じるのが残念かな

さらに上のものから「モス」を含むものを抜き出す.

grep テリヤキ mos.txt | grep -v コーン | grep モス

モスバーガーとテリヤキバーガーも菜摘にしてくれよ
4月からモスチーズ買えますテリヤキ冒険しますってサイトに出てるけど

さらにチーズとかいているものだけに

grep テリヤキ mos.txt | grep -v コーン | grep モス | grep チーズ

4月からモスチーズ買えますテリヤキ冒険しますってサイトに出てるけど

wikipediaの「日本の古墳一覧」のページからの情報のぬきとり:
http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%8F%A4%E5%A2%B3%E4%B8%80%E8%A6%A7 

ウェブページを直接grepしてみる.
ウェブページを取得するコマンド.
w3m を使う

w3m -dump アドレス

でウェブページをコマンドプロンプト(標準出力上に出力する -dumpオプションが標準出力への取得)
(0)直接モスバーガーの感想を2ちゃんねるから取得して表示

w3m -dump http://ikura.2ch.net/test/read.cgi/jfoods/1394464945/ 

スレ全体が表示される.

パイプでつないで「まずい」の行だけ取り出す.

w3m -dump http://ikura.2ch.net/test/read.cgi/jfoods/1394464945/  | grep まずい
<<
 
>>
コーンはまずい。甘すぎる。照焼きで甘いのにさらにコーンが激甘。
    単にゴルゴンゾーラチーズがすっぱすぎてまずいだけなのかもしれないが
<<
cygwinだけファイルに保存しないで直接「まずい」の感想だけとりだせた.

パイプでつないで「まずい」の行だけ取り出す.
>|sh|
w3m -dump http://ikura.2ch.net/test/read.cgi/jfoods/1394464945/  | grep コーン
<<
とか
>|sh|
w3m -dump http://ikura.2ch.net/test/read.cgi/jfoods/1394464945/  | grep テリヤキ
<<
とかやれば「コーン」とか「テリヤキ」の感想が色々感想がとりだせる. 
「コーン」の例
>>
 コーンコロッケのバーガーが早く食べたい
    コーンかき揚げとかずいぶん変化球だな。
    包装を開けるとコーンの匂いしかしない
    コーンと揚げ物の味もする
    粒コーンはウンチにトッピングされて出てくるよな
    コーンはまずい。甘すぎる。照焼きで甘いのにさらにコーンが激甘。
    アナルから飛び出したコーン
    コーンてベジっていうか穀物じゃんか
    コーンのテリヤキは娘のを一口強奪しただけだが、マヨネーズとコーンが俺には合
    今日、リッチチーズと照焼きコーンかき揚げ?めっちゃ美味しかった
(略)
<<
ほかのスレッドでももちろんできる.
>|sh|
w3m -dump http://anago.2ch.net/test/read.cgi/bizplus/1406106263 | grep 安倍


(1)古墳一覧のページをw3mで取得

w3m -dump http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%8F%A4%E5%A2%B3%E4%B8%80%E8%A6%A7 

ページが表示される

日本の古墳一覧

出典: フリー百科事典『ウィキペディアWikipedia)』
移動: 案内、検索

日本の古墳一覧(にほんのこふんいちらん)は、日本に存在する、全国的に著名な古墳
をまとめたもの。 Category:日本の古墳も参照。

目次
...

(2)前方後円墳と書かれた行だけとりだす (前方後円墳一覧を作る)

 w3m -dump http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%8F%A4%E5%A2%B3%E4%B8%80%E8%A6%A7 | grep 前方後円墳

• 天神森古墳東置賜郡川西町、前方後方墳、県史跡)
• 大安場古墳群(郡山市、前方後方墳ほか、国の史跡)
• 桜井古墳南相馬市、前方後方墳、国の史跡)
• 丸山古墳石岡市、前方後方墳、県史跡)
• 船玉古墳筑西市、方墳、県史跡)
□ 駒形大塚古墳(前方後方墳)
☆ 吉田温泉神社古墳(前方後方墳)
那須八幡塚古墳(前方後方墳)
□ 上侍塚古墳(前方後方墳)
□ 下侍塚古墳(前方後方墳、形が美しい古墳として有名)
• 金山塚古墳栃木市、上円下方墳、県史跡)
• 大枡塚古墳佐野市、方墳、県史跡)
• 藤本観音山古墳足利市、前方後方墳、国の史跡)
以下略


(3)「県史跡」と書かれた行だけとりだす.県史跡一覧を作る.

 w3m -dump http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%8F%A4%E5%A2%B3%E4%B8%80%E8%A6%A7 | grep 県史跡

• 藤沢狄森古墳群(紫波郡矢巾町、末期古墳、県史跡)
• 浮島古墳群(岩手町、末期古墳、県史跡)
• 岩野山古墳群(南秋田郡五城目町、末期古墳、県史跡)
• 鳥屋八幡古墳(黒川郡大和町、円墳、県史跡)
• 高瀬山古墳寒河江市、円墳、近辺に複数の方形周溝墓、県史跡)
• 二色根古墳群(南陽市、円墳、県史跡)
• 天神森古墳東置賜郡川西町、前方後方墳、県史跡)
• 清水前古墳群(東置賜郡高畠町、円墳、県史跡)
• 安久津古墳群(東置賜郡高畠町、群集墳、県史跡)
• 谷柏古墳群(山形市、群集墳、県史跡)
• 菅沢古墳2号墳(山形市、東北地方最大の円墳、直径52メートル、県史跡)
• 高原古墳山形市、墳形不明、県史跡)
以下略

(4)「県史跡」と書かれた行のうち前方後円墳を含まれた行を表示する.
 「県史跡」で「前方後円墳」のもの一覧を表示する

$ w3m -dump http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%8F%A4%E5%A2%B3%E4%B8%80%E8%A6%A7 | grep 県史跡 | grep 前方後円墳

• 土矢倉古墳群(上山市前方後円墳ほか、県史跡)
□ 杵ガ森古墳前方後円墳、4世紀初頭、東北最古級、県史跡)
• 二子塚古墳大玉村前方後円墳、県史跡)
• 傾城壇古墳大玉村前方後円墳、県史跡)
• 国見八幡塚古墳国見町前方後円墳、県史跡)
• 日下塚古墳東茨城郡大洗町前方後円墳、県史跡)
□ 府中愛宕山古墳前方後円墳、県史跡)
• 星神社古墳常陸太田市前方後円墳、県史跡)
• 安食太子古墳かすみがうら市前方後円墳、県史跡)
• 熊野古墳かすみがうら市前方後円墳、県史跡)
• 八幡塚古墳つくば市前方後円墳、県史跡)
(以下略)

(4)「県史跡」と書かれた行のうち前方後円墳を含まれた行を表示する.
 「県史跡」で「前方後円墳」のもの一覧をファイルに保存する.
(第6回でおこなったリダイレクト「<」の応用)

$ w3m -dump http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%8F%A4%E5%A2%B3%E4%B8%80%E8%A6%A7 | grep 県史跡 | grep 前方後円墳 > ken_zenpoukouenhun.txt

ファイルの内容の確認 (第6回でおこなったcatコマンドの応用)

cat ken_zenpokouenhun.txt

(5)県史跡でかつ円墳の一覧のファイルを作る.
grep -v xxx」 xxxを除外した行を除くの応用

 w3m -dump http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%8F%A4%E5%A2%B3%E4%B8%80%E8%A6%A7 | grep 県史跡 | grep 円墳 |  grep -v 前方後円墳 

「円墳」だけだと「前方後円墳」まで含んで検索されてしまうので,そこから前方後円墳を含む行を除く.

リダイレクトでファイルに保存

 w3m -dump http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%8F%A4%E5%A2%B3%E4%B8%80%E8%A6%A7 | grep 県史跡 | grep 円墳 |  grep -v 前方後円墳  > ken_enhun.txt


ファイルの内容の確認

cat ken_enhun.txt

• 鳥屋八幡古墳(黒川郡大和町、円墳、県史跡)
• 高瀬山古墳寒河江市、円墳、近辺に複数の方形周溝墓、県史跡)
• 二色根古墳群(南陽市、円墳、県史跡)
• 清水前古墳群(東置賜郡高畠町、円墳、県史跡)
• 菅沢古墳2号墳(山形市、東北地方最大の円墳、直径52メートル、県史跡)
• 谷地久保古墳白河市、円墳、県史跡)
• 車塚古墳東茨城郡大洗町、円墳、県史跡)
• 大日山古墳(円墳、県史跡)
• 穴薬師古墳猿島郡五霞町、円墳、県史跡)
• 戸祭大塚古墳宇都宮市、円墳、県史跡)
(略)

問1:村に古墳は存在するか?
問2:村の古墳だけを表示することができないか。
問3: 町にある国の史跡のうち前方後円墳でも、円墳でも、方墳でもなく、はいくつかるか?
問4: 町にある国の史跡の方墳の名前は?


問1:大玉村とかにある.

$ w3m -dump http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%8F%A4%E5%A2%B3%E4%B8%80%E8%A6%A7 | grep 村
  • 古墳文化の展開が見られる北限は、山形県村山地方付近までである。
  • 泉崎横穴(西白河郡泉崎村、横穴古墳、国の史跡)
  • 二子塚古墳(大玉村、前方後円墳、県史跡)
  • 傾城壇古墳(大玉村、前方後円墳、県史跡)
  • 高塚古墳(榛東村、前方後円墳、県史跡)
  • 帝塚山古墳(大阪市住吉区、伝大伴金村の墓、前方後円墳、国の史跡)
  • 高市郡明日香村
  • 国富中村古墳(出雲市、円墳、国の史跡)
  • 野村八幡古墳(美馬市、円墳、県史跡)
  • 大村横穴群(人吉市、装飾古墳、国の史跡)
<<2:「、」をつける.
>|sh|
$w3m -dump http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%8F%A4%E5%A2%B3%E4%B8%80%E8%A6%A7 | grep 村、
  • 泉崎横穴(西白河郡泉崎村、横穴古墳、国の史跡)
  • 二子塚古墳(大玉村、前方後円墳、県史跡)
  • 傾城壇古墳(大玉村、前方後円墳、県史跡)
  • 高塚古墳(榛東村、前方後円墳、県史跡)

<<3:アンサー 23個くらい
>>
w3m -dump http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%8F%A4%E5%A2%B3%E4%B8%80%E8%A6%A7 | grep 町、 | grep -v 前方後円墳 | grep -v 円墳 | grep -v 方墳 | grep 国の史跡
<<

コマンドで数えると、、
>>
w3m -dump http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%8F%A4%E5%A2%B3%E4%B8%80%E8%A6%A7 | grep 町、 | grep -v 前方後円墳 | grep -v 円墳 | grep -v 方墳 | grep 国の史跡 | wc
<<
>>
     23      46    1542
<<
#wc は word count 行数を数えるコマンド

問4:「橘塚古墳」:
>>
 w3m -dump http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%8F%A4%E5%A2%B3%E4%B8%80%E8%A6%A7 | grep 町、 | grep 国の史跡 | grep 方墳
  • 雨の宮古墳群(鹿島郡中能登町、前方後方墳ほか、国の史跡)
  • 二子塚古墳(南河内郡太子町、双方墳、国の史跡)
  • 丹田古墳(三好郡東みよし町、前方後円墳または前方後方墳、積石塚、国の史跡)
      □ 橘塚古墳(京都郡みやこ町、方墳、国の史跡)
<<

2重ループ
>|c|
#include <stdio.h>

int main(){
int i;
int j;
int k;
while(i<=3){
 while(j<=4){
  while(k<=5){
   printf("i:%d j:%d k:%d\n",i,j,k);
   k+:
  }
  j++;
 }
 i++;
}