• 締切済み

grepコマンドの使い方

下記のようなファイルがあるとします。 カレントディレクトリ /home から"hello"という文字列が含まれるテキストを grepしたい場合、コマンドはどのようにすればいいのでしょうか? 色々な方法があると思いますが、よろしくお願いします。 ---------------------------------------------------------------------- /home/hoge1/foo1.txt foo2.exe foo3.txt /home/hoge2/hogehoge2/foo4.txt foo5.exe /home/hoge3/hogehogehoge3/foo6.txt foo7.exe foo8.zip ----------------------------------------------------------------------

みんなの回答

  • estea
  • ベストアンサー率44% (39/87)
回答No.3

バイナリをはずすなら -I オプションが有効らしいです grep hello -r /home/ -I でいいですか?

参考URL:
http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html
  • estea
  • ベストアンサー率44% (39/87)
回答No.2

> -d ACTION, --directories=ACTION > (中略) > ACTION が recurse なら、 grep は各ディレクトリ下の > すべてのファイルを再帰的に読み取ります。 > これは -r オプションと等価です。 らしいんで grep hello -r /home/ はどうなんだろう

参考URL:
http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html
hiropon80
質問者

お礼

ご回答ありがとうございました。 こんな短いコマンドでできるとは思いませんでした。 しかし、例の *.exe にも "hello" が含まれると引っかかってしまいます。 パイプ等を使用すると複雑になるのでしょうか?

  • NNori
  • ベストアンサー率22% (377/1669)
回答No.1

grep は引数で指定されたファイルからしか検索できないので、 /home 以下のすべてのファイルを対象にgrep したいときは、 find と組み合わせるのはいかがでしょうか。 また、grep はファイルをひとつしか指定しないと検索した結果しか表示されなくファイル名がわからなくなってしまうので、grep の引数に-l をつけてファイル名を表示させた方がいいですね。 find /home -exec grep -l hello {};

hiropon80
質問者

お礼

ご回答ありがとうございました。 実行した結果エラーが表示されてしまいました。。。 ここはLinuxカテゴリですが、当方cygwinでした。 すみません。

関連するQ&A

  • grepで特定のディレクトリを除外して再帰検索するには?

    /hoge下のサブディレクトリ、ファイルで文字列mojiretsuを検索したいのですが 特に/hoge/foo下は除外して検索する場合には grepコマンドはどう記述したらいのでしょうか? # grep -lr mojiretsu /hoge だと/hoge/fooも検索されてしまいますよね。

  • vimのgrepの使い方がよくわかりません

    WindowsXPでvimを使い始めたのですが、 grepのやり方がよくわかりません。 一応、unixでgrepやviは最低限レベルでは使えます。 やりたいこととしては、 指定のテキストから、特定の文字列を検索して、 結果を一覧で表示させて、 その中からどれか選んで、その行へジャンプして表示する ということがやりたいです。 で、たぶんgrepでやれるんじゃないかと思って質問しています。 grepに関する簡単な解説を読むと、 (esc)したあと、 :grep hoge hoge.txt でできる、というようなことが書いてあるのですが、 上記で実行すると、 :!findstr /n hoge hoge.txt > c:xxxxxxxx 2>&1 (1 of 1): 1:hoge と出ますが、ここから何をしていいかわかりません。 grepの機能としてはここで終わりなのでしょうか? ここから結果の行へジャンプしたりできないのでしょうか? また、grep対象のファイルって毎回自分で入力するのでしょうか? たとえば、現在編集しているファイルを対象としたい場合、 現在のファイル名となる変数みたいものはあるのでしょうか?

  • grepコマンド

    質問させてください。 ファイルから指定した文字列を含まない行を別ファイルに 書き込もうとしています。 gunzip -c tmp.gz | grep -i -v '.txt' > work.txt 上記の場合、tmp.gzを解凍したファイルの行に大文字・小文字関係のない ".txt(Txt, tXt, TxT, ・・・"の文字列を含まない行を  work.txtに書き込んでいます。 これはうまくいったのですが、判定文字列を複数にすると 『ファイルを見つけようとしてエラーがでました』となります。 ちなみにコマンドは gunzip -c tmp.gz | grep -i -v '.txt' -i -v '.log' -i -v '.pdf'> work.txt 複数の大文字小文字を区別しない指定された文字列を含まない行を 別ファイルに書き込むにはどのようにすればいいのでしょうか? すみません、あまり経験がないのでお許しください。 よろしくお願いいたします。

  • Unix初心者による初心者シェルプログラミングです。

    Unix初心者による初心者シェルプログラミングです。 以下のようなコマンドを羅列しただけの スクリプトが300行(実質100行ぐらい)が漸くできるようになりました。 これだけで、おばかさんな私は進化してます。が・・・ 対象となる、hoge.txtは、同ディレクトリ内に別名で、200ファイル有ります。 このスクリプトがその別名、200ファイルへと対象になります。 と云う事はファイル名分の200ファイル分スクリプトを編集して用意しなくては いけなくなる。 となると・・・ 別の事をしないといけませんよね。 どうやら、同ディレクトリ内にある、全ての .txt ファイルに対してこの スクリプトを実行させるには・・・ (よくわかりませんが・・・) FILE=`/home/foo/*.txt` みたいな・・・(全然違うと思っていますが、イメージで) /home/foo/ 内の .txt ファイルを一ファイルずつ読み込んで、実行させる方法が あると思うのですが・・・ 全てを教えて貰うつもりはありません。 学習していきます。 でも、疲れてきました。 がしかし、やらなくちゃいけません。 ヒント下さい。 お願いします! > cat hogehoge.sh #!/usr/bin/sh DAY=`/usr/xpg4/bin/date '+%Y/%m/%d%a'` HUMAN=`/usr/ucb/whoami` TIME=`/usr/xpg4/bin/date '+%H:%M:%S'` echo echo "$DAY : $HUMAN : PID $$" echo echo "$0" echo echo "$TIME Let's start!" echo echo "ls -l /home/foo/hoge.txt" ls -l /home/foo/hoge.txt echo echo "cat -n /home/foo/hoge.txt | head -15" cat -n /home/foo/hoge.txt | head -15 echo echo "sed -f /home/foo/script.sed /home/foo/hoge.txt > /home/foo/new-hoge.txt" sed -f /home/foo/script.sed /home/foo/hoge.txt > /home/foo/new-hoge.txt echo echo "ls -l /home/foo/new-hoge.txt" ls -l /home/foo/new-hoge.txt echo echo "cat -n /home/foo/new-hoge.txt | head -18" cat -n /home/foo/new-hoge.txt | head -18 echo echo "sed -e '1d' -e '14d' /home/foo/new-hoge.txt > /home/foo/renewal-hoge.txt" sed -e '1d' -e '14d' /home/foo/new-hoge.txt > /home/foo/renewal-hoge.txt echo echo "ls -l /home/foo/renewal-hoge.txt" ls -l /home/foo/renewal-hoge.txt echo echo "diff /home/foo/new-hoge.txt /home/foo/renewal-hoge.txt" diff /home/foo/new-hoge.txt /home/foo/renewal-hoge.txt echo echo "sed -e '13d' -e 's/^iranai/hitsuyou/' /home/foo/renewal-hoge.txt > /home/foo/new-hoge.txt" sed -e '13d' -e 's/^iranai/hitsuyou/' /home/foo/renewal-hoge.txt > /home/foo/new-hoge.txt echo echo "ls -l /home/foo/new-hoge.txt" ls -l /home/foo/new-hoge.txt echo ・ ・ ・ ・ ・ ・ ・ ・ 300

  • grep 正規表現の扱い方 特定のファイル郡のみを指定するには?

    ディレクトリのファイルをgrepを使った正規表現で指定したいのですが、 /hoge/temp[001-999].php のように、hogeディレクトリにあるphpファイル全てを含め、なおかつ、 /hoge/foo/temp[001-999].php のように、hoge/fooディレクトリにあるphpファイルを全て含めない正規表現の書き方を教えてほしいです。 正規表現にあまり詳しくなく、思いつくものといっても「hoge/.*.php」くらいで、当たり前ですが双方のディレクトリが含まれてしまいます・・・。 もう一つ、質問です。 /hoge/ ディレクトリにあるファイル全てを含め、なおかつ /hoge/foo/ ディレクトリにあるファイルは全て含めない という指定の仕方も教えてほしいです。 分かる方がいましたら、お手数ですがぜひ教えてください。よろしくお願いします<(_ _)>

  • 可変長コマンドとその中のファイル名を変数に格納するには?

    宜しくお願い致します。 可変長のコマンド(空白が可変個ある文字列)とそのコマンド文字列内のtxtファイル やdivファイルやpsファイルやtexファイル名(ひとコマンドにファイル名は1つだ け)を取り出し 変数に代入するスクリプトtest.shを考えています。 #!/bin/bash -x COMMAND= FILE= のイコールの右辺には何と記述すればいいのでしょうか? 具体的には $ ./test.sh hoge foo hoe.dvi hoehoe hogehoge … とした時(コマンド分の長さは可変) COMMANDに「hoge foo hoe.dvi hoehoe hogehoge …」という文字列、 FILEに「hoe.dvi」 を代入したいのです。

  • 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コマンドに詳しい方、宜しくお願いします。 それ以外にも、色々検索方法知っていたら教えて下さい!!

  • シェルスクリプト コマンドを変数にした時の呼び方

    はじめまして、シェルスクリプトを勉強中の者です。 コマンドを変数にいれて、まとめました。 しかしコマンドの変数を呼びこもうとするとエラーになります。 ============================================ #!/bin/sh GREP="grep" cat "${GREP} '^[0-9]' /home/hoge/test.nicdf" ============================================ ================ シェル実行結果 ============= $ ./test.sh cat: grep '^[0-9]' /home/hoge/test.nicdf: そのようなファイルやディレクトリはありません どう書けば、エラーにならずに正常に動作するでしょうか? ご教授の程よろしくお願いします。

  • WindowsでPATHにあるコマンドを補完?

    お世話になります。 Windowsのコマンドラインプロンプトでは、ある程度タイプして[TAB}キーを押下すると、カレントディレクトリにあるファイル名を補完してくれます。 たとえば xxxxYYY というファイルがあるディレクトリにおいて  C:\foo\> x[TAB] のようにタイプすると、xxxxYYYと補完されます。 LinuxやMacを含むUNIX系のコマンドライン環境では、カレントディレクトリだけでなく、PATHに入っているコマンドも補完してくれます。具体的に言うと、C:\myProgram\bin\xxxxYYY.exeというコマンドを、C:\fooという全然違うカレントディレクトリにあっても、  C:\foo\> x[TAB] で補完してくれます。 この、PATHにあるコマンド名の補完は、Windowsでも可能でしょうが。 具体的には、何らかのフリーウェアを常駐させる、レジストリを書き換えるなどによって、可能になるでしょうか。 私は20年以上DOS/Windowsを使い込んでいるのですが、この機能さえあれば本当に助かります。 Linuxを使え、WindowsでCygwinを使えというのはナシで、あくまでWindowsのcmdを使い続けるという前提でお願いします。 よろしくお願いいたします。

  • 文字列検索

    文字列検索 テキストファイルの検索を行いたいです. 下記のようなサンプルファイルでfooを検索し, 含まれるならマッチした個数,含まれないならnilを返す関数を作りたいです. mecabを用いて形態素解析を1行ずつしようかと思ったんですが, 大量のファイルを処理する予定なので,オーバヘッドが気になります. 関数でgrepがあるみたいですが,マッチした行しか返されません. 標準関数で1行ずつよみこんで,1行のなかでマッチした回数を返す関数はありますか? --sample.txt-- foo foo bar bar foo hoge,hoge,hoge,hoge hage-hage-hage-foo -- end --

    • ベストアンサー
    • Ruby