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ユーザーではない人を探しています。

ファイルをgrepingしようとしましたが、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""

関連情報