• ベストアンサー

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% (4900/10358)
回答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