• ベストアンサー

簡易grepコマンドの作成を自作プログラムで作りたいのですが……

簡易grepコマンドの作成を自作プログラムで作りたいのですが…… C言語でです。 C++ではなぃです。 できれば初心者が考えるよぉなプログラムで。 またコメントみたぃにプログラムの意味も詳しくわかりやすくあると助かります。 コンパイルは ./mygrep 検索するもの ディレクトリ/ファイル名 だった気がします。 mygrepはプログラム名です。 おねがぃします。

質問者が選んだベストアンサー

  • ベストアンサー
  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.3

>grepコマンドの自作プログラムを作ってほしぃのです。 それはもはや自作とは呼べません >考え方だけ 1.コマンドラインから検索したい文字列を指定したパラメータを取得する 2.検索対象ファイルを読み込んで指定された文字があるか検索(比較)する 3.結果を表示する 4.他に対象のファイルがあるなら2へ無ければ終了

その他の回答 (4)

回答No.5

 #4さんが言われているように、実現するにはかなりの力量が要ります。  以下に、チョー簡単なプログラムを示しますが、使い方はターミナルのシェルプロンプトから    mygrep<data_file '234' という風にリダイレクトを用いた入力としてください。このコマンドの実現は、strstr()関数から得られるものです。  なお。data_fileは↓のような1行の内容のファイルを用意し、 123456789abcdef 引数に '345' とか '543' を用いて起動すれば取り合えずの grep が体験できるでしょう。  このサンプルプログラムから   1.プロトタイプ宣言の書き方   2.引数の取り方と解析の仕方   3.ファイルの読み方   4.エラー処理の仕方   5.文字列(バイト列)処理の仕方 などを学んで欲しいものです。 /* mygrep command by Mac OSX * file name: 5133.c * compile: gcc 5133.c -o mygep * execution: mygrep<△△ファイル '○○○' */ #include <stdio.h> #include <string.h> #define MEM_SIZE 512 char buf[MEM_SIZE], *key; int chkarg(int, char **); int main(int argc, char *argv[]) { char *p; int n; /* 引数解析 */ if (chkarg(argc, argv) != 0) { fprintf(stderr, "Parameter error?n"); return 0; } /* メインプログラム */ fgets(buf, MEM_SIZE, stdin); while(!feof(stdin)) { p = strstr(buf, key); if (p != NULL) //printf("%s", buf); printf("%s", p, key); else ; //何もしない fgets(buf, MEM_SIZE, stdin); } return 0; } int chkarg(int argc, char *argv[]) { if (argc != 2) return -1; else { key = argv[--argc]; return 0; } }

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.4

どれくらいの「簡易」を期待しているのでしょうか。 grepのreは正規表現(regular expression)を表していますが、正規表現をサポートしたプログラムを書こうとするとかなりの分量になります。 参考までに、GNU grepのソースコードならftp://ftp.ring.gr.jp/pub/GNU/grep/から入手できます。

回答No.2

...で、ご質問は?

513366545
質問者

補足

grepコマンドの自作プログラムを作ってほしぃのです。 すぃません、プログラムでもどのような考え方だけでもかまいません。 お願いします。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

で、何がわからないんでしょうか? >できれば初心者が考えるよぉなプログラムで。 回答を課題の結果として提出するから…ですか? 高度(?)なものだと、先生にバレる…とか。 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) {  char cmd[100];  sprintf(cmd, "grep %s %s", argv[1], argv[2]);  return system(cmd); }

513366545
質問者

補足

質問はgrepコマンドを自作でつくることです。 コマンドラインから取得なので… あとcmdの使い方はまだよくわかりません(泣) あと課題は課題です。 ですが初心者というのは、 ほんとに初心者だからです。 すぃません。 みなさんならどんな自作プログラムを考えれるのかと思い、 質問をしています。 プログラムを提示が一番うれしぃですが どんな考え方をするのかだけでもかまいません。 すぃません、お願いします。

関連するQ&A

  • C言語中でunixのコマンドを使いたい

    c言語でプログラムを作ってるんですが、カレントディレクトリ名や、ある名前のファイルが存在するかどうかや、あるファイル中にある文字列があるかどうかなどの判定を行いたいんですが、cで一から記述すると長くなりそうなので、pwcやfind、grepといったコマンドをc言語中で実行でると便利だと思ったんですが、そんな事ってできますかね?

  • linuxのgrepコマンドに関して

    linuxのgrepコマンドに関して ファイルの中から、1や2という文字が単独で存在する行を検索したくて grep 1 file名 とするのですが、そうすると11や23など文字が単独ではなく、含まれている行が出力されます。 含まれる、ではなく文字そのものを検索するにはどうしたらよいでしょうか?

  • grepの書き方がわかりません。

    Perlの初心者なんですが、以下のようなテーマをもらってプログラムを作っています。  第一引数にディレクトリのパス、第二引数に検索し たいファイル名を指定して第一引数の  パス以下にある全てのディレクトリを検索してファイルがあればそのパスを表示させなさい。 一応できたのですがプログラムの記述の一部がよくわかりません。以下のプログラムは一部です。 local ($dir, $file) = @_; opendir(DIR,$dir) or die @data = readdir(DIR);#ディレクトリの内容を読む closedir(DIR);#ディレクトリを閉じる local @fname = grep {-f "$dir/$_"} @data; local @dname = grep {-d "$dir/$_"} @data; $dir,$fileには第一、第二引数の文字列をいれているのですがそのディレクトリになかにファイル、ディレクトリがないか検索するためgrepを使っています。それで"$dir/$_"の部分の意味がよくわかりません。 この部分は他のサイトであったものを流用しただけなのですがよくわからないまま使ってたまたま動いたから使用しててこのままでは理解していないままなので どうか教えてほしいです。 あともう一点ありましてgrepのところで最初自分で書いた時  local @fname = grep (-f,@data); というように書きました。ファイルが第一引数にあるときは問題なく動作するのですがその下にあるディレクトリにあるとなぜかプログラムが終わりません。 デバッグとして@dataの中身を表示したらそのディレクトリの検索をしてはいるんですが、その中に目当てのファイルがあるはずなのに@dataの中身がからっぽで ファイルがないことになっています。この違いがどうしてもわかりません。  以上の二点がわからないんですがどうかお手数ですがどなたか教えてください。  

    • ベストアンサー
    • Perl
  • UNIXコマンド "grep" "find" の使い方教えて下さい。

    1)以下(1)、(2)を検索したいとします。  (1)"wrk_str"という文字列の記述があるファイル名  (2)tmp_file.c という名前のファイル名 2)ディレクトリ構成が以下になってるとします。  /home/users/複数のディレクトリが存在/複数のディレクトリが存在/複数のファイルが存在 3)/home/users/ 配下に検索したい文字列、ファイルがあるとした場合、どのように   探せばいいでしょうか?   /home/users/配下で得に条件なしでgrepすると、"Arg list too long"(量が多い?)の   メッセージが出て、検索できませんでした。 UNIXコマンドに詳しい方、宜しくお願いします。 それ以外にも、色々検索方法知っていたら教えて下さい!!

  • grepについて

    Freebsdにおいてgrepというコマンドがあると思いますが、このgrepで特定の階層にある特定のファイルを探すことはできるのでしょうか? あるファイルの中に存在する、特定の文字などを検索するやり方は分かるのですがファイル名を検索しようとしても、やり方が分からずできません。 それとも、もともとgrepコマンドは、あるファイル内に存在する文字を検索するためのコマンドなのでしょうか?? その辺りも、よく分かりません。 他に、grepはこういう時に便利!!みたいな例があれば教えてくださいませ。 ご回答の程、よろしくお願い致します。

  • execからのls grepコマンドについて

    PHPで階層になっているディレクトリ名をすべて取得するプログラムを作成しています。 ディレクトリ数、ファイル数が非常に多いので動作速度向上のためにlinuxコマンドで取得するために以下の命令を記述しました。 exec("ls -l | grep '^d' ./hogehoge/hugahuga/",$aDir); var_dump($aDir); これを実行しても $aDirに値が入りません。 どうすれば望みどおりの結果になるでしょうか。

    • 締切済み
    • PHP
  • C++言語でのライブラリファイルの作成と使用法

    よろしくお願いします。 C言語において、例えばMinGWのCコンパイラのLibディレクトリには、拡張子が「.a」のライブラリファイルがたくさん存在しています。これらは、arコマンドで ar crv libMine.a 1.o 2.o のように作成されるものだと認識しています。 一方、C++言語において、例えばBorlandのC++コンパイラのLibディレクトリには、拡張子が「.lib」というライブラリファイルがたくさん存在します。 これらのファイブラリファイルは、C言語のaファイルと同じ役割をする考えてよいのでしょうか? また、C++において自作のライブラリファイル(libファイル)を作成するにはどうすればよいのでしょうか? 次に、C++における自作ライブラリの使用法についてですが、Cではコンパイル時に gcc -o 1.exe 1.c libMine.a のようにして、自作のライブラリファイルを使うことができますが C++のコンパイルコマンド、例えばbcc32コマンドを使ってコンパイルする時に、 自分が作成したlibファイルを使うにはどのようにすればよいのでしょうか? 最後に、Borland C++コンパイラをインストールするときに、Binディレクトリにあるbcc.cfgファイルに -L"c:\Borland\Bcc55\lib" と記述したのですが、これは、 c:\Borland\Bcc55\libにあるlibファイルをコンパイル時に自動的に読み込むということなのでしょうか?

  • grep コマンドでディレクトリ検索

    grep コマンドでディレクトリ検索 tmp/bbb tmp/bbb.cc というディレクトリがある時 ls | grep -w "bbb" でtmp/bbbだけ取りたいけど bbb.ccまで取ってしまうんで困ってます。 どうやったらtmp/bbbだけ取れますか? まったく一致のbbbを検索したいです。

  • grepコマンドのAオプションが使えない

    たすけてください! grep -A 10 検索条件 検索ファイル とコマンドを打つと grep:認識できないフラグ:A と出てきます。 どうしたら使えますか?

  • コマンドプロンプト、JDKについて

    この度JAVA言語を勉強しようと思いまして、 JAVA言語の参考書を購入し、勉強、練習しているのですが、JDKをインストールし、コマンドプロンプト内にてディレクトリの移動まではできるのですが、ソースファイルを作成し、javacでコンパイルしようとするとコマンドプロンプト内にて「’javac’は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。」と表示されコンパイルできないのですが、その原因が全くわかりません。対処法を教えてください。 OSはXPです。

専門家に質問してみよう