アプリ版:「スタンプのみでお礼する」機能のリリースについて

grepコマンドについて質問です。

grepコマンドでCSVファイルを参照し、ある項目に特定の文字列でないものがあれば、そのファイル名を取得する処理をしたいと思っています。

つまり、ある項目を$strとすると
$str <> 'aaaaaa'
という処理をgrepで行おうと考えています。

現状では、
grep -l '^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^(aaaaaa)]' ファイル名

等を試していますが、[^(aaaaaa)]だと一文字目しか判別できていないようです。[^a{6}]などもうまくいきません。

何かいい方法があれば教えて頂きたいと思います。
宜しくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

返答が遅くなってしまい申し訳ありません。
ご回答ありがとうございます。

上記のシェルでうまく取得できているようです。
検索文字列にヒットしないものを抽出したいので、
if (( $CNT != 0 )) を if (( $CNT == 0 ))
としました。

シェルまで作成していただきありがとうございました。

お礼日時:2006/03/02 11:21

[^なんとか] は何文字書こうが1文字にしかマッチしません。



7列目がaaaaaaばかりのファイルはリストせずに、それ以外のファイルをリストしたいということですよね。

grep -v -l '^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,aaaaaa' ファイル名…

awkを使うなら、
awk -F, '$7!="aaaaaa"{print FILENAME;nextfile}' ファイル名…
awkの種類によってはnextfileコマンドが無いかもしれません。man awk で確認ください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
返信が遅くなり申し訳ございません。

grep -v -l '^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,aaaaaa' ファイル名…

ですが、このgrepですとCSV表記でならんでいることも否定して結果が出力されてしまっているようです。

正しい表記も現在も考察中です。
ご回答ありがとうございました。

お礼日時:2006/03/02 11:28

いまいちよくわからないのですが,



・正規表がいらないならfgrep
・ファイルを根こそぎ検索して欲しいなら-rオプション
という感じで

$ fgrep -r "\$str <> 'aaaaaa'" .

とかではダメなんでしょうか?
ちなみにファイル名を入手する手っ取り早い方法はfindですね

$ find <dir> -name <name>

<dir>は任意の数のディレクトリを指定できます.<name>はワイルドカードが使えます(「"*foo*"」とか)
-nameをもっと複雑にしたいならgrepと混ぜる方法がありますね

$ find <dir> -print | grep <regex>

とか
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
返信が遅くなってしまい、申し訳ありません。

今回の検索は、ファイルの中身を1つずつ調べて検索にヒットしたファイル名を抽出したいのでfindは利用できないかなと思います。

ファイルの中身がCSVなので単純に"\$str <> 'aaaaaa'"としてしまうと他の項目も見られてしまうので、対応に困っていました。

ご回答ありがとうございました。

お礼日時:2006/03/02 11:26

該当項目を抜き出してからgrepではいけないのでしょうか? awkを使うと指定項目だけを抜き出せます。



↓7項目目を抜き出す
awk -F, '{print $7}' ファイル名

この回答への補足

ご回答ありがとうございます。

grep検索の例で、ファイル名と書いたのが間違いでした。
正確には「ファイルパス」です。

あるディレクトリ内に大量のファイルがあり、そこから該当のファイルを短時間で検索したかったため、grepコマンドを利用しようと考えました。

awkコマンドを知らなかったので調べてみましたが、awkコマンドでファイル名を抽出することは可能なのでしょうか?

補足日時:2006/02/24 16:42
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!