🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

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

Q&A

解決済

2回答

287閲覧

【Linux】特定の値以外の場合の行を取得したい

satsukichan

総合スコア52

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

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

2グッド

1クリップ

投稿2019/09/27 02:56

#【Linux】特定の値以外の場合の行を取得したい

とあるアクセスログで以下の様なログが出力されます。

http 2019-08-31T23:55:01.838483Z app/xxxxxx/6958dfc8cc16177b 10.2.11.168:40698 10.1.2.132:80 0.000 0.425 0.000 200 200 ...etc

通常時は問題ないのですがごくまれに行末尾の2か所「200 200」の部分が「400 400」「500 500」のように出力され、
その際にはHTTP4XXもしくは5XXエラーとなります。

特定のディレクトリ以下のファイルについて該当の2か所が「200 200」以外の出力であった場合に該当行を出力する

にはどのようにすればよろしいでしょうか?
ログファイルは多数ありイメージとしては

less 201909/*| grep -v "200 200"

なのですがこの方法ですと対象のファイルが表示されるのみで該当行は表示されません。

less 201909/01/*| grep -v "200 200"

サブディレクトリまで打ち込むと上手くいきます。ただしこの方法では一括検索が出来ません。

宜しくお願いします。

DrqYuto, uouo👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

grep-r オプションを使うと指定ディレクトリ配下のファイルを再帰的にチェックできます。

sh

1grep -rvniE '200 200' --include='*' ./

各オプションの意味は・・・
大文字と小文字を区別しない -i
拡張正規表現を使う -E
行を表示 -n
指定ディレクトリ配下を再帰的に検索 -r
ファイル名を正規表現で指定 --include=''

投稿2019/09/27 03:05

uzyexe

総合スコア239

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

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

satsukichan

2019/09/27 03:14 編集

ありがとうございます。 こういう事でしょうか grep -rvniE '200 200' --include='*' ./ もしくは less 201909/* | grep -rvniE '200 200' --include='*' ./ ヒットはしますがやはりファイル名だけが出力されます。 該当行を出力できませんでしょうか。 ちなみに該当ファイルはgz形式で圧縮されております。
uzyexe

2019/09/27 03:16

あ、なるほど。gz形式なのですね。 では、grep のオプションはそのままで、gz形式にも対応している zgrep を使用すると解決できると思います。 zgrep -rvniE '200 200' --include='*' ./
uzyexe

2019/09/27 03:20

あ、less コマンドのほうは必要ありません。 以下のようにzgrepコマンドにディレクトリをご指定ください。 zgrep -rvniE '200 200' --include='*' 201909/*
satsukichan

2019/09/27 03:27 編集

ありがとうございます。 /usr/bin/zgrep: -r: option not supported -rオプションが使えないようです。こちらでも調べてみます。
uzyexe

2019/09/27 03:51

zgrep にはgzip版とzutils版の2種類があって、-r オプションを使う場合は zutils 版である必要があるようです。 ubuntu系ならaptコマンドを使えば簡単にzutilsをインストールすることができますが、 apt update && apt install zuitils (zutilsをインストールすれば、-rオプションが使えるzgrepが使えるようになる。) centos系にzutilsをインストールするにはソースをダウンロードして、makeしてインストールする苦行を強いられるようです... この場合、findコマンドをパイプで繋げてあげるのが一番簡単かもしれませんね。 find 201909 -type f -name "*" | xargs zgrep -vniE '200 200'
satsukichan

2019/09/27 05:07

上手く検索できました!沢山アドバイス頂きありがとうございます。
guest

0

こちらの方法だと目的は達成できるかと思います。

grep -rv "200 200" 201909/* | less

参考になりましたら幸いです。

投稿2019/09/27 03:22

uouo

総合スコア16

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

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

satsukichan

2019/09/27 05:07

gzではこの方法ではうまくいきませんでした。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問