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

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

新規登録して質問してみよう
ただいま回答率
85.31%
grep

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

1回答

1956閲覧

正規表現を用いた、複数ファイルのgrep

risako0404

総合スコア0

grep

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2021/08/12 02:23

前提・実現したいこと

検索パス ap/log
上記パスに、a.log a.log.1 …
b.log b.log.1 …
というファイルが存在します。

これらのファイルをgrepコマンドで、日付を検索キーで1発で出力させたいです。(ログファイルの中身の先頭はいずれも日付)

grep ^“日付” ap/log/{?.log,?.log.??}

上記で一応出力できるのですが、

{?.log,?.log.??}の部分を正規表現で、もう少しスマートにすることはできないのでしょうか?

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

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

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

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

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

otn

2021/08/12 02:58

他に対象外のファイルがあり、ap/log/* とか、ap/log/*.log* とかでは駄目と言うことでしょうか?
risako0404

2021/08/12 03:07

コメントありがとうございます。 はい。*を使わず、なるべく再帰的な検索を避けたいと思っております。
itagagaki

2021/08/12 03:12

それはシェルのパス名展開のパターンであって、正規表現ではありません。 (正規表現でglobできるシェルが、もしかしたらあるのかもしれませんが)
otn

2021/08/12 03:17

> はい。*を使わず、なるべく再帰的な検索を避けたいと思っております。 「はい」というのは対象外のファイルがあるかという質問に対して「ある」という意味の回答でしょうか? > *を使わず、なるべく再帰的な検索を避けたいと思っております。 これは意味がわかりません。
risako0404

2021/08/12 03:26

ある。で問題なしです。 システムトラブルや人為的なミスで、関係のないファイルが検索されることを避けたいです。 なので、 *を使わずに、なるべくパス名を指定した形で検索したいという意味です。 ファイル名に関して、例で挙げてますが、実態はもう少し複雑なファイル名になっております。 ▪️ それはシェルのパス名展開のパターンであって、正規表現ではありません。 →存じております。このパス名の箇所を、正規表現で、さらに可読性を上げ、スマートにできないかな、、と模索しておりました。.logと.log.n(n=1-10) を一つの正規表現にできないものかと、、
itagagaki

2021/08/12 03:42

そこの引数に、``やxargsなどを使って ・候補となりうるすべてのファイルのパス名をテキストとして得る ・何かしらの正規表現が使えるコマンドでテキストを処理する ・目的のコマンドラインを生成する という時点で、より複雑で非効率な方向にしかならない気がします。
otn

2021/08/12 09:33

> *を使わずに、なるべくパス名を指定した形で検索したいという意味です。 > ファイル名に関して、例で挙げてますが、実態はもう少し複雑なファイル名になっております。 ワイルドカードの機能だけだと目的のファイルを絞り込めないので、正規表現を使わざるを得ず、正規表現で絞り込む方法知りたいと言うことですか? 質問文からはとてもそういう想像は出来ないです。 > ファイル名に関して、例で挙げてますが、実態はもう少し複雑なファイル名になっております。 具体的に書いた方が、役に立つ回答が得られると思います。
guest

回答1

0

再帰的な検索っていうのが何だかよく分かりませんが、
ファイル名に対する正規表現でのマッチングで対象ファイルを絞り込みたいという話なら、xargsとgrepを組み合わせるのが一番わかりやすいのではないでしょうか。

ls | egrep '.log($|.[0-9])' | xargs -i egrep -H '^日付' {}

投稿2021/08/12 05:26

KojiDoi

総合スコア13727

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

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

shiketa

2021/08/12 05:36

> 再帰的な だから、lsではなくfindにすればいいのかと。 `find ap/log -type f | egrep 以下同文`
KojiDoi

2021/08/12 05:50

質問を読む限り、サブディレクトリを再帰的に下りていくという意味での「再帰」とは思えなかったんですよね。
angel_p_57

2021/08/12 23:29

どっちにしろ「正規表現で」と言われたら、find に正規表現でのマッチ機能があるので、それで終わる話かと思います。 ※サブディレクトリの内部まで探すかどうかは -maxdepth で制御すればどうとでもなるし… なお、xargs の -i は地味に無駄かと。
KojiDoi

2021/08/13 09:09

> xargs の -i は地味に無駄かと。 ああ、いつのまにかdeprecatedなオプションになってたんですね。古くからこれで染みついてるもので。
angel_p_57

2021/08/13 14:40

> いつのまにかdeprecatedなオプションになってたんですね。 それもありますけど、"find ~ | xargs grep パターン" で済むところに、-i や -I'{}' によるコマンドライン引数の置換を使う意味がないでしょう、という話です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問