質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

Q&A

解決済

3回答

6089閲覧

シェルスクリプト find、grepで見つけたファイルのパスをcatに渡して表示させる方法を知りたい

Kchan_01

総合スコア110

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

0グッド

1クリップ

投稿2020/07/27 13:30

シェルスクリプトを学び始めた初心者です。macを使っています。Terminalはzshです。

find . | grep test.c | cat

でgrepで見つけたファイルのパスを受け取ってcatで中身を表示させたいのですが、ファイルのパスが表示されるだけで、うまくいきません。

該当するファイルはひとつです。

パイプの役割はコマンドの出力を、次のコマンドの標準入力に渡すなので、上記のコマンドで表示されるという想定でした。
単にパスが表示されるというのは、find . | grep test.cで生成されたパスのファイルを格納したtextファイル?を表示させたということでしょうか。

その場合、どう書き換えれば、find . | grep test.cで取ったパスをcatで表示させることができるのでしょうか。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

パイプの役割はコマンドの出力を、次のコマンドの標準入力に渡すなので、

その理解で合ってます。
理解が間違っているのは、catについてでしょう。catは標準入力の内容をそのまま出力しますので、

ファイルのパスが表示されるだけで、

となります。ファイル名を与えてその中身を表示したい場合は、ファイル名を標準入力でなくコマンドラインに与えます。cat ファイル名です。

なので、そのまま書き直すと、コマンド置換を使って、

sh

1cat `find . | grep test.c`

になります。

test.cという名前のファイルの内容を表示したいのなら、grepするのでなく、

sh

1cat `find . -name test.c`

です。

Zshということなので、単に、

Zsh

1cat **/test.c

でもいいです。

投稿2020/07/27 14:18

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kchan_01

2020/07/27 15:25

ありがとうございます。catのmanを確認しました。 ```man If file is a single dash (`-') or absent, cat reads from the standard input. ``` 以前、コマンドライン引数と標準入力は同じものだと思っていて、その間違いを指摘されたことがあるのですが、腑に落ちないままでいました。今回の@otnさんの説明でその違いをはっきり理解できました。 zshのワイルドカード知りませんでした。これは便利ですね! ありがとうございます。
guest

0

terminal

1cat `find . | grep hoge.c `

bash専用(zshでも使えた気がする)

terminal

1cat $(find . | grep hoge.c )

terminal

1find . | grep hoge.c | xargs cat

あと厳密に言うと「hoge.c」だと「.」が正規表現のメタ文字で「hogeXc」とかにも一致してしまうのでそれが困る場合はエスケープしたほうが良いです。

terminal

1cat $(find . | grep hoge\.c )

投稿2020/07/27 13:35

編集2020/07/27 13:51
hidezzz

総合スコア1248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kchan_01

2020/07/27 15:27

xargsを知りませんでした。使います。ありがとうございます!
guest

0

cat不要です。

find . -type f -exec grep -E "test.c" /dev/null {} \; | awk -F ':' '{print $2}'

以下修正

find . -type f -exec grep -E "test.c" {} \;

以上。

投稿2020/07/27 14:04

編集2020/07/27 14:25
hana_yama_san

総合スコア923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問