プロが教える店舗&オフィスのセキュリティ対策術

UNIX環境で、

SJISファイルを日本語でgrepしたのですが、
ファイル名が出力されずにうまくいきません。

どなたかご教授願えないでしょうか。

[自分のコマンド]
find ./ -type f -print | xargs nkf -e | grep 'テスト'

とし、日本語は検地できたのですが、
ファイル名が出力されずに困っております。

grep -l としたら、↓のエラーが表示されました。
xargs: nkf: シグナル 13 によって終了しました


サブディレクトリも含めて検地したいのですが、
なにかいい方法ありますでしょうか。

A 回答 (5件)

パイプの最終段が



grep 'テスト'

になっている限り、途中で何をしても無駄。

grepは「標準入力から受け取った行に『テスト』と文字があるかどうか」しか判断しない。

受け取った行が「ファイル名の表示」なのか「ファイルの中身」なのか、そんな事は判らないし、知ったこっちゃない。

もし「ファイル名を表示させたい」なら、grepのパターン式に「ファイル名表示行に一致する検索パターン」も指定しないといけない。

例えば、grepよりも前のコマンドが、ファイル名表示を

File Name : ほげほげ

と言う表示をするのであれば、grepには「『テスト』の他に『File Name : 』で始まる行も出せ」と指示しないといけない。
    • good
    • 0
この回答へのお礼

ありがとうございます。

やはりファイル名を指定しないといけないんですね。
ですが、ファイル名が分からないので、
走せざるを得ないんですが、
ファイル名を一旦取得した、そのファイル名から
grep するしかないですかね。

お礼日時:2013/06/03 15:34

そりゃぁそんなコマンド打ったらファイル名など出力されるはずもありませんが....



そもそも何をしたいのでしょうか?
    • good
    • 0

grepで、ファイルからではなく標準入力から検索しているので、ファイル名が出なくて当り前です。


grepが検索しているのは、xargsコマンドの標準出力であって、特定のファイルではありません。

また、xargsでは、nkf -e に複数のファイルを指定するようなものなので、各ファイル毎という処理には向いていません。

何らかの方法で、ファイル名と出力を結びつける必要があります。


例えば
find . -type f -exec sed 's|^|{}:|' \{\} \; | nkf -e | grep -a 'テスト'
findでファイルを検索→sedで先頭をファイル名に置き換えるたものを標準出力 (findの-execでは{}がファイル名の置き換わる)
→ nkf -e でEUC-JPにしたものを標準出力
→grepで検索

とか。

nkf -e | grep $1 | sed "s|^|$2:|"
をgrep-euc.shとして
find . -type f -exec grep-euc,sh 'テスト' \{\} \;
とするとか

ファイル名に日本語が含まれていると、誤動作するかもしれませんが。
    • good
    • 0

訂正


誤: nkf -e | grep $1 | sed "s|^|$2:|"
正: nkf -e $2 | grep $1 | sed "s|^|$2:|"

この回答への補足

ありがとうございます。

試してみます。

補足日時:2013/06/03 19:16
    • good
    • 0

grep --label でファイル名として表示される文字列を指定できます。


1ファイル毎に個別にgrepの起動が必要。

find . -type f -exec sh -c 'nkf -e {} | grep --label={} -H テスト' \;
    • good
    • 0
この回答へのお礼

ありがとうございます。
無事なんとか解決できました。

お礼日時:2013/06/16 16:15

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