• ベストアンサー

grepコマンドでの文字列検索

grepコマンドについて質問です。 grepコマンドでCSVファイルを参照し、ある項目に特定の文字列でないものがあれば、そのファイル名を取得する処理をしたいと思っています。 つまり、ある項目を$strとすると $str <> 'aaaaaa' という処理をgrepで行おうと考えています。 現状では、 grep -l '^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^(aaaaaa)]' ファイル名 等を試していますが、[^(aaaaaa)]だと一文字目しか判別できていないようです。[^a{6}]などもうまくいきません。 何かいい方法があれば教えて頂きたいと思います。 宜しくお願いします。

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

  • ベストアンサー
  • dobaken
  • ベストアンサー率63% (7/11)
回答No.2

コマンド一発でファイル名を取得する方法は思いつないので、とりあえずシェルを作ってみました。 下記シェルをファイルがあるディレクトリに置いて、検索文字列をパラメータにして実行してみてください。 シェル名:test.sh、検索文字列:aaaaa の場合 ./test.sh aaaaaa ◎注意点 $7の部分はCSVファイルの何番目の項目かを表しているので実際の値に変えてください。 【CNT=`awk -F, '{print $7}'・・・・】 例:2番目の項目なら$7⇒$2 ------------------------------------------------ #/bin/ksh SHELLNM=$0 STRING=$1 ls | awk '{print $1}'| grep -v $SHELLNM | while read LIST do set -- `echo $LIST` FILENAME=$1 CNT=`awk -F, '{print $7}' $FILENAME |grep $STRING|wc -l|awk '{print $1}'` if (( $CNT != 0 )) then echo $FILENAME fi done exit 0

puyol_xavi
質問者

お礼

返答が遅くなってしまい申し訳ありません。 ご回答ありがとうございます。 上記のシェルでうまく取得できているようです。 検索文字列にヒットしないものを抽出したいので、 if (( $CNT != 0 )) を if (( $CNT == 0 )) としました。 シェルまで作成していただきありがとうございました。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.4

[^なんとか] は何文字書こうが1文字にしかマッチしません。 7列目がaaaaaaばかりのファイルはリストせずに、それ以外のファイルをリストしたいということですよね。 grep -v -l '^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,aaaaaa' ファイル名… awkを使うなら、 awk -F, '$7!="aaaaaa"{print FILENAME;nextfile}' ファイル名… awkの種類によってはnextfileコマンドが無いかもしれません。man awk で確認ください。

puyol_xavi
質問者

お礼

ご回答ありがとうございます。 返信が遅くなり申し訳ございません。 grep -v -l '^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,aaaaaa' ファイル名… ですが、このgrepですとCSV表記でならんでいることも否定して結果が出力されてしまっているようです。 正しい表記も現在も考察中です。 ご回答ありがとうございました。

  • elf2000
  • ベストアンサー率50% (6/12)
回答No.3

いまいちよくわからないのですが, ・正規表がいらないならfgrep ・ファイルを根こそぎ検索して欲しいなら-rオプション という感じで $ fgrep -r "\$str <> 'aaaaaa'" . とかではダメなんでしょうか? ちなみにファイル名を入手する手っ取り早い方法はfindですね $ find <dir> -name <name> <dir>は任意の数のディレクトリを指定できます.<name>はワイルドカードが使えます(「"*foo*"」とか) -nameをもっと複雑にしたいならgrepと混ぜる方法がありますね $ find <dir> -print | grep <regex> とか

puyol_xavi
質問者

お礼

ご回答ありがとうございます。 返信が遅くなってしまい、申し訳ありません。 今回の検索は、ファイルの中身を1つずつ調べて検索にヒットしたファイル名を抽出したいのでfindは利用できないかなと思います。 ファイルの中身がCSVなので単純に"\$str <> 'aaaaaa'"としてしまうと他の項目も見られてしまうので、対応に困っていました。 ご回答ありがとうございました。

  • dobaken
  • ベストアンサー率63% (7/11)
回答No.1

該当項目を抜き出してからgrepではいけないのでしょうか? awkを使うと指定項目だけを抜き出せます。 ↓7項目目を抜き出す awk -F, '{print $7}' ファイル名

puyol_xavi
質問者

補足

ご回答ありがとうございます。 grep検索の例で、ファイル名と書いたのが間違いでした。 正確には「ファイルパス」です。 あるディレクトリ内に大量のファイルがあり、そこから該当のファイルを短時間で検索したかったため、grepコマンドを利用しようと考えました。 awkコマンドを知らなかったので調べてみましたが、awkコマンドでファイル名を抽出することは可能なのでしょうか?

関連するQ&A

  • grepについて

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

  • grepの出力結果の保存

    LinuXのgrepコマンドに関する質問です。 既存のファイルからgrepコマンドで特定の文字列が含まれた行だけを抽出し、その行数を数えるという課題です。 行数を数えるのでwcコマンドを使おうと思ったのですが、wcコマンドは「wc (ファイル名)」という使い方をしますよね。 ということは、grepコマンドで抽出した結果をファイルに保存しなくてはならないのですが、やり方がわかりません。

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

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

  • ディレクトリ内より特定の文字列を検索する際に関しまして

    文字列の検索に関して質問させていただきます。 あるファイル内から、 特定の文字列を探す際は、 grepを使用して検索をしています。 また、全体の中からファイル名を探す際なども、 findを使って、 探したりしているわけなんですが、 そうではなくて、 あるディレクトリ内にある 複数のファイル内全てから、 「特定の文字列が含まれているか?」を 探すコマンドってあるのでしょうか? 例えばこんな感じです。 ディレクトリAにファイルが10個あるとします。 この10個のファイルの中のどこかに、 「FOO_HEADER」という文字列が 存在しているか?を確認したいときに、 そう思いました。 今までなら、grepを使って、 1つずつファイル内を探したりしていました。 検索サイトで探してみたのですが、 キーワードが悪いのか、 どうも見つけることが出来ませんでした。 もしご存知の方がいらっしゃいましたら、 アドバイスの程お願い致します。 ■OS:Fedora9 ※ 通常はbashを使用しています。

  • 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コマンド "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にマッチした正規表現の文字列を取得したい

    grepにマッチした正規表現の文字列を取得し、マッチした文字列を 一覧で取得したいのですが、方法がわかりません。 ※例 grep [0-9][0-9][0-9][0-9][0-9] 検索ファイル名 > 出力ファイル名 不明点あればお知らせください。 よろしくお願いします。

  • grepの使い方

    "A.lst"と"B.lst"の2つのファイルがあります。 ともにディレクトリ階層の一覧が記述されています。 2つのファイルを比較して、A.lstのディレクトリ階層の文字列を 含む行を、B.lstから抽出して、リダイレクトで出力するには、 どういうコマンド操作になるのでしょうか。 特定の文字列ならば単純に、cat B.lst | grep moziretsu > sample.lst でいいわけですが、この文字列がA.lstファイル内に複数行あり、 それを順にgrepするにはどうすればいいのかがわかりません。 シェルもただいま勉強中です。 よろしくご教授願います。

  • 複数の文字列を検索

    あるログファイルの文字列を取得して。検索でヒットした文字列行 を返すスクリプトを作成しております。 検索:"OK"    日付 対象行 : OK! Tue Jul 19 文字列"OK"は普通に # grep "OK" ログファイルPath で検索できますが、 文字列と日付を両方引っ掛ける場合は・・・ grep -e "OK" -e env LANG=c date -u +"%a %b $d" ログファイルPath 当然コマンドエラーになります。 dateコマンドから日付を取得して、grepにて引っ掛ける方法を知りたいので すが、お分かりになる方、ご教授お願い致します。

  • grepによる文字列検索のシェル作成の手順

    Solaris9のOSにて、以下の仕様のシェルを作成したいと思っています。 特定のディレクトリ配下にある全てのファイル内で特定の文字列「abc」のある行を抽出し、ファイル化したい。 (検索対象が1ファイルであれば、grep -n abc test.txtでよいですが、ファイル名がたくさんある場合のシェルの作り方がわかりません。) また、どのファイルから検索したのかがわかるように抽出した行の前にファイル名をつけられると大変助かります。 例) ---test1.txtから検索--- 8:XXXXabcXXXX 11:XXXXabcXXX ---test2.txtから検索--- 10:XXXXXXXXabcXX お手数ですが、宜しくお願いします。