1から特定の行まで文字列をgrep

1から特定の行まで文字列をgrep

私は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のみが印刷されるため、簡単に検索して最後まですべての項目を一致させることができます。grepALTER 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:

関連情報