私はディレクトリ内のファイルセット全体を検索し、最初のカンマの前にある特定の文字列だけを見つける効率的な方法を見つけようとしています。
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
""