• 締切済み

出力各行の特定文字より左をパイプで渡す

$ find /tmp -type f | sudo xargs grep -i ok /tmp/01.txt:ok wave /tmp/02.txt:ok wave /tmp/03.txt:ok wave それぞれの出力に対して txt より左をパイプで渡して gedit によりそのファイルを開き、 この例では3つのタブが開かれるようにしたいのですが、 どうすればよいでしょうか? よろしくお願いします。

みんなの回答

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.3

> $ find ./ -type f | grep -l ok > とやると全く結果が帰ってこないかと思ったら > (標準入力) > と表示されたので、何だろうと思ったのですが・・・ それは find の出力に 'ok' という語句が含まれていたので、'(標準入力)' と表示されたんだと思いますよ? -l を付けなければ一致したパス名が表示されるでしょうし、xargs を付ければ見付けたファイルの内容を grep しますから全然意味が違います。 例えば find . -name . | grep -l ok とすれば grep に掛からなくなるので何にも表示されないでしょう。

marebo
質問者

お礼

どうもありがとうございます。 マニュアルの -l, --files-with-matches Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning will stop on the first match. (-l is specified by POSIX.) の意味もよく分からなかったのですが、 このオプションは grep の検索にヒットしたものがあった場合に入力の場所のみを表示する、 くらいの意味に捉えておけばいいようだと思いました。

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.2

>この結果ってどう解釈すればよろしいのでしょうか? 見たまんまだと思うのですが、何が不明ですか? 後者は目的に合わないコマンドですよね。

marebo
質問者

お礼

どうもありがとうございます。 $ find ./ -type f | grep -l ok とやると全く結果が帰ってこないかと思ったら (標準入力) と表示されたので、何だろうと思ったのですが・・・ grepをパイプを通して使うと標準入力からinputをもらっているということで、 気にするほどのことでもなかったのかもしれません。

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.1

ファイル名だけ得たいのなら、grep -l です。 $ find /tmp -type f | sudo xargs grep -li ok /tmp/01.txt /tmp/02.txt /tmp/03.txt $ find /tmp -type f | sudo xargs grep -li ok | sudo xargs gedit

marebo
質問者

お礼

どうもありがとうございます。 難しいコマンドで操作しなくてはいけないのかなと思っていたのですが こんなに簡単にできるのですね。 ついでにもう一つ質問してよろしいでしょうか。 $ find ./ -type f | xargs grep -l ok ./04.txt $ find ./ -type f | grep -l ok (標準入力) この結果ってどう解釈すればよろしいのでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A