• ベストアンサー

findコマンドについて

unix コマンドについて質問です。 ファイル1の中に"A=1" ," B=2", "C=3"という文字列が入っているとします。 ファイル2の中に"D=1" , "E=2", "F=3"という文字列が入っているとします。 そのことを自分は知りません。 Aという文字が入っているファイルを探す為、 以下のfindコマンドを打ち、ファイル1のlsの結果が表示されました。 find ./ -type f -exec grep 'A' {} \; -ls その後、出力されたファイル1の中からBとCでgrepしてB=2", "C=3"を表示したいと思います。 上のコマンドと併せて一度でできるコマンドを教えていただけないでしょうか? 宜しくお願いします。

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

  • ベストアンサー
  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.2

xargsで繋いでもいけるような気がします。 find ./ -type f -exec grep -q 'A' {} \; -print | xargs grep \[BC\] 見たいな具合に。 ファイル名も欲しければ、 find ./ -type f -exec grep -q 'A' {} \; -print | xargs grep \[BC\] /dev/null かな。

weboflife
質問者

お礼

回答ありがとうございます。 こういう風にコマンドを繋ぐのですね。 大変参考になりました。

その他の回答 (1)

回答No.1

あまり悩まずに素直にコマンド作った方が早いと思います。 要件がよく理解できないのですが「文字列Aを含むファイルにて文字列Bと文字列Cのgrep結果を得る」と解釈します。 以下のようなスクリプトを作成します。(便宜上、aresgrepとでもしましょう) # find ./ -type f -exec grep -q $1 {} \; -fprintf /tmp/aaa$$ "grep $2 %p\n" sh /tmp/aaa$$ rm -f /tmp/aaa$$ # で、次のように実行できるはずです。 aresgrep A B aresgrep A C もし要件が違ってましたら、上記スクリプトの修正で対応できると思いますがいかがでしょうか?

weboflife
質問者

お礼

回答ありがとうございます。 参考にさせていただきます。

関連するQ&A

  • unixのfindコマンド

    unixのfindコマンドで、ある複数のディレクトリから指定のファイル名だけを 検索し、その結果をgrepしたいのですが、 例えば 01_dir 02_dir : 11_di : 21_dir : と言うディレクトリがあります。 そこから、「0」で始まっているディレクトリの中なら拡張子が*.txtを 検索し、その検索したファイルに対して、grepを実行したいのですが、 上手くいきません。 もちろん、各ディレクトリには、「.txt」以外のファイルもありますし、 ファイル名にも条件を付与したいです。 以下の様に、 find . -name "0*_dir" -type d -print | xargs ls -l *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs ls *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls -l '{} /*.txt' | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls {} "検索文字" とやってみたのですがだめでした。 find ./ -type d \( -name '1_*dir' -o -name '2*_dir' -o -name '3*_dir' \) -prune -o -type f -print と「-prune」で除外するディレクトリを指定すればできなくはないですが、 すべてのディレクトリ書くのはいい方法ではないです。 よい方法をお願いします。 OSは、Solaris 11.3です。

  • find,grepの使い方

    こんにちは SYSTEM V系のUNIXで 複数ファイルからaaaという文字列を含むファイルを 抽出し、さらにその中からbbbという文字列を含む ファイルを抽出するにはどうすればいいでしょうか? find,grep等を使えばできそうな気がするのですが 具体的にどう書けばいいか分かりません。 お分かりになる方、ご回答お願い致します。

  • unixのfindコマンドについて。

    unix(AIX)のfindコマンドで「find ./ -type f」というコマンドで一覧を取得しています。 「./」の中に「hogehoge -> /tmp/test」というような シンボリックリンクを使用しているディレクトリがある場合も、 「./hogehoge/hoge.log」 というように表示させるにはどうすれば良いでしょうか。 ご回答の程、宜しくお願い致します。

  • FINDコマンドについて

    あるディレクトリでファイルの中に『abcde』という文字を含むファイルをさがしたいのですが、 FINDコマンドはどのように指定すればよいでしょうか?

  • findとxargsの使い方で

    unixで、findとxargsを使って検索を行っています。 以下の様に、 find . -type f | xargs コマンド 例えば、 find . -type f | xargs ls -l を実行すると、 「xargs: 入力ファイルが壊れています。: バイトシーケンスが正しくありません。」 が出力されます。 何が原因なのでしょうか。 また、解消方法はどのようにすればよいのでしょうか。 環境は solaris10 LANG=ja_JP.UTF-8 sh or bash

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

  • findコマンドの-nameについて

    独習Linux第2版で勉強しています。 findコマンドのnameオプションについて質問があります。 テキストでは下記のようなコマンド例が載っています。 find Reports/ -type f -name '*\.bak' -exec rm {} \; nameオプションでワイルドカードを使いたいので パターン部分をシングルクォートで囲っていることは理解できるのですが 「.bak」のドット前にバックスラッシュがついている意味がわかりません。 ネットでfindコマンド例を探してみると、 find Reports/ -type f -name '*.bak' -exec rm {} \; という感じでバックスラッシュなしで説明されています。 実行結果に変わりはないようですが、意味が理解できず困っています。 教えてください。

  • findコマンドについて

    findコマンドをコマンドプロンプトより下記のとおり実行しました。 find "保留中" D:\find.txt 想定された結果を得る事ができました。 しかし、同じコマンドをバッチファイル(find.bat)として実行すると、コマンドを 繰り返し実行し続けていて終了せずに、結果を表示する事ができません。 何がいけないのでしょうか?

  • findコマンドで複数条件を設定する方法

    findコマンドを使用して、最終更新日から10日以上経過しているかつ、拡張子が.gz 以外のファイルを圧縮する方法を教えていただきたいです。 それぞれ1つの条件を満たすコマンドはわかるのですが、2つの条件を満たすコマンドをどの様に作成すればよいかわかりません。 最終更新日から10日以上経過したファイルを圧縮 find . -mtime +10 -exec gzip {} ¥; 拡張子が.gz意外のファイルを圧縮 find . -name "*.gz" -prune -o -type f -print -exec gzip {} ¥; よろしくお願いします。

  • findの結果をlsで詳細表示

    はじめまして。 Linux初心者です。 カレントディレクトリ以下のディレクトリやファイルの一覧を詳細表示するには「find ./ | xargs ls -lF」などとすると思いますが xargsを使用せずに「find ./ | ls -lF」とすると、なぜNGなのでしょうか。「xargs」の意味を調べると、 (1) 標準入力から空白か改行で区切られた文字列群を読み込む。 (2) xargsの引数のコマンドの後ろに、標準入力から受け取った文字列群を付け足して、そのコマンドを実行する。 とありました。上記の説明で「xargs」を付けることによる効果はわかるのですが、ls以外のコマンドを使用する際にもfindと組み合わせる際には、 すべてのコマンドで「xargs」を使用しなければいけないのでしょうか。 lsの結果をmoreする際などには、「ls | more」で良いと思うのですが、 「ls | xargs more」としない理由がわかりません。 どなたかわかりやすく教えて頂ければ幸いです。 よろしくお願いします。