- ベストアンサー
grepコマンドでの文字列検索
grepコマンドについて質問です。 grepコマンドでCSVファイルを参照し、ある項目に特定の文字列でないものがあれば、そのファイル名を取得する処理をしたいと思っています。 つまり、ある項目を$strとすると $str <> 'aaaaaa' という処理をgrepで行おうと考えています。 現状では、 grep -l '^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^(aaaaaa)]' ファイル名 等を試していますが、[^(aaaaaa)]だと一文字目しか判別できていないようです。[^a{6}]などもうまくいきません。 何かいい方法があれば教えて頂きたいと思います。 宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
コマンド一発でファイル名を取得する方法は思いつないので、とりあえずシェルを作ってみました。 下記シェルをファイルがあるディレクトリに置いて、検索文字列をパラメータにして実行してみてください。 シェル名: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
その他の回答 (3)
- notnot
- ベストアンサー率47% (4900/10358)
[^なんとか] は何文字書こうが1文字にしかマッチしません。 7列目がaaaaaaばかりのファイルはリストせずに、それ以外のファイルをリストしたいということですよね。 grep -v -l '^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,aaaaaa' ファイル名… awkを使うなら、 awk -F, '$7!="aaaaaa"{print FILENAME;nextfile}' ファイル名… awkの種類によってはnextfileコマンドが無いかもしれません。man awk で確認ください。
お礼
ご回答ありがとうございます。 返信が遅くなり申し訳ございません。 grep -v -l '^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,aaaaaa' ファイル名… ですが、このgrepですとCSV表記でならんでいることも否定して結果が出力されてしまっているようです。 正しい表記も現在も考察中です。 ご回答ありがとうございました。
- elf2000
- ベストアンサー率50% (6/12)
いまいちよくわからないのですが, ・正規表がいらないならfgrep ・ファイルを根こそぎ検索して欲しいなら-rオプション という感じで $ fgrep -r "\$str <> 'aaaaaa'" . とかではダメなんでしょうか? ちなみにファイル名を入手する手っ取り早い方法はfindですね $ find <dir> -name <name> <dir>は任意の数のディレクトリを指定できます.<name>はワイルドカードが使えます(「"*foo*"」とか) -nameをもっと複雑にしたいならgrepと混ぜる方法がありますね $ find <dir> -print | grep <regex> とか
お礼
ご回答ありがとうございます。 返信が遅くなってしまい、申し訳ありません。 今回の検索は、ファイルの中身を1つずつ調べて検索にヒットしたファイル名を抽出したいのでfindは利用できないかなと思います。 ファイルの中身がCSVなので単純に"\$str <> 'aaaaaa'"としてしまうと他の項目も見られてしまうので、対応に困っていました。 ご回答ありがとうございました。
- dobaken
- ベストアンサー率63% (7/11)
該当項目を抜き出してからgrepではいけないのでしょうか? awkを使うと指定項目だけを抜き出せます。 ↓7項目目を抜き出す awk -F, '{print $7}' ファイル名
補足
ご回答ありがとうございます。 grep検索の例で、ファイル名と書いたのが間違いでした。 正確には「ファイルパス」です。 あるディレクトリ内に大量のファイルがあり、そこから該当のファイルを短時間で検索したかったため、grepコマンドを利用しようと考えました。 awkコマンドを知らなかったので調べてみましたが、awkコマンドでファイル名を抽出することは可能なのでしょうか?
お礼
返答が遅くなってしまい申し訳ありません。 ご回答ありがとうございます。 上記のシェルでうまく取得できているようです。 検索文字列にヒットしないものを抽出したいので、 if (( $CNT != 0 )) を if (( $CNT == 0 )) としました。 シェルまで作成していただきありがとうございました。