私はLinuxで作業しており、次のコマンドを実行しています。
$ ls -t postgresq*.log | head -n1 | xargs grep "ALTER USER"
< pg_user 2021-07-15 05:03:41.609 EDT > LOG: statement: ALTER USER username WITH ENCRYPTED PASSWORD 'JUly@#12' valid until '2021-07-20';
しかし、私は次の文字列をgrepしたいと思います。
ALTER USER username WITH ENCRYPTED PASSWORD 'JUly@#12' valid until '2021-07-20';
答え1
-o
ちょうど(で)man grep
を使用してください:
$ man grep | grep -P -A1 -- '^\s+-o'
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.
行内の一致部分-o
のみが印刷されるため、簡単に検索して最後まですべての項目を一致させることができます。grep
ALTER USER.*
ALTER USER
$ ls -t postgresq*.log | head -n1 | xargs grep -oP 'ALTER USER.*'
ALTER USER username WITH ENCRYPTED PASSWORD 'JUly@#12' valid until '2021-07-20';
気づく出力の解析ls
一般的に良い考えではありませんが、これらのログファイルの名前は単純でなければならないので安全です。
答え2
zsh
シェルを使用してsed
探している行を見つけて修正します。
sed '/ALTER USER/ s/.*statement: //' postgresq*.log(.om[1])
ワイルドカードパターンについてpostgresq*.log(.om[1])
は後で詳しく説明します。私の答え到着前の質問。つまり、名前がパターンに一致する最も最近修正された一般ファイルの名前に拡張されるかpostgresq*.log
、パターンに一致する名前がないとエラーが発生します。
表現sed
方式
/ALTER USER/ s/.*statement: //
指定されたファイル内の文字列を含むすべての行を見つけ、行の先頭ALTER USER
から文字列の後の空白まですべてを削除しますstatement:
。