Linuxファイルを検索し、特定の文字列をフィルタリングして、その他すべてを削除します。

Linuxファイルを検索し、特定の文字列をフィルタリングして、その他すべてを削除します。

ディレクトリ内のファイルセット全体を検索し、最初のコンマまでの特定の文字列のみを検索する効率的な方法を見つけようとしています。

postgres ログ ファイルの例:

Apr 27 03:35:18 test postgres[24098]: [5-1] user=postgres,db=postgres,app=psqlclient=127.0.0.1
Apr 27 03:35:18 test postgres[24098]: [5-2] user=postgres,db=postgres,app=psqlclient=127.0.0.1 

私が興味があるのは、ファイルで使用されているユーザー名だけです。pgbadger を使用して HTML 経由で確認することもできますが、かなり時間がかかります。

たとえば、次のものを見ることができます:

user=postgres

ユーザーの前後のテキストセット全体とは対照的です。

ただし、特に postgres 以外のユーザーを探しています。

ファイルに対して grep を使用しようとしましたが、user=postgres の結果しか表示されません。

たとえば、user= を最初のコンマまで検索するなど、一連のファイルを検索する方法はありますか?

あるいは、すべてのファイルを検索し、各行の user= の前にあるものをすべて削除して、Excel に入力し、必要な結果を取得することもできます。

どのような助けでも大歓迎です。

答え1

GNU grep一緒に使用PCRE:

grep -Po -- '(?<=user=).+?(?=,)' *.log

キーワードも表示したい場合はuser=:

grep -o -- 'user=[^,]*' *.log

-H 上記のコマンドにオプションを追加することで、一致が成功したファイルを表示することもできますgrep(このオプションがない場合、複数のファイルが指定された場合にのみファイル名が表示されます)。

したがって、grepコマンドは次のようになります。

grep -Ho -- 'user=[^,]*' *.log

出力は次のようになります。

pgsql.log:user=postgres
pgsql.log:user=postgres

答え2

使用方法awk:

awk '/user=/{gsub(/^.*user=|,.*$/, "");print $0}' file

ファイル名を表示したい場合はuser=、コマンドを変更することができます。

awk '/user=/{gsub(/^.*user=|,.*$/, "");
printf "%s:user=%s\n",FILENAME,$0}' *.log

このコマンドで、user=が見つかった場合、 gsub()レコードの先頭からuser=コンマに続く文字とuserレコードの末尾までの文字を取得する関数が、それらを空の文字列 ( "") に変更します。

関連情報