ディレクトリ内のファイルセット全体を検索し、最初のコンマまでの特定の文字列のみを検索する効率的な方法を見つけようとしています。
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
レコードの末尾までの文字を取得する関数が、それらを空の文字列 ( ""
) に変更します。