一致後に残りの行を印刷するには、grepを使用します。

一致後に残りの行を印刷するには、grepを使用します。

まあ、これが私を狂わせている!ログファイルからいくつかの情報を収集し、電子メール通知の要約に追加しようとしています。

ログから:

2019/07/22 11:36:03 [14396] 生成されたファイル数: 3 (reg: 2, dir: 1)

最後の部分、3、2、1、または最後の部分3(reg:2、dir:1)の数字だけを印刷したいと思います。

私は別の方法を試してみましたが、これが私が得た最も近い方法ですが、数字3だけを印刷し、私が望む残りの情報は印刷しません。

nf=$(grep -o 'created files:' $logfile) | cut -d\   -f3)

これは可能ですか?

編集する:

わかったので、私はこれを働くのに使っています。nf=$(grep -Po 'created files: \K.*' "$logfile")

要約すると、次のような出力を得るために$ nfを追加すると、Created $nf new files次のような結果が得られます。

3つ(reg:2、dir:1)新しいファイルが作成されました。

これで、どういうわけかこれをさらに分割して結果を次のようにすることができますか? 1つのディレクトリと2つのファイルが作成されました。

たぶん、2つの別々のgrepコマンドを使って異なる変数を出力できますか? 1つはdir用、もう1つはreg用です。

答え1

grepPerl互換正規表現(PCRE)をサポートしている場合:

$ grep -Po 'created files: \K.*' "$logfile"
3 (reg: 2, dir: 1)

数値を配列に保存するには、次の手順を実行しますbash

$ numbers=( $(grep -o 'created files:.*' "$logfile" | grep -o '[0-9]\+') )
$ echo ${numbers[@]}
3 2 1
$ echo "${numbers[0]}, ${numbers[1]}, ${numbers[2]}"
3, 2, 1

答え2

Perlが構造に来ます:

$ perl -ne 'print "$1 $2 $3\n" if /created files: (\d+) \(reg: (\d+), dir: (\d+)\)/' < "$logfile"
3 2 1

または次のようにsed

$ sed -nEe 's/.*created files: ([0-9]+) \(reg: ([0-9]+), dir: ([0-9]+)\)/\1 \2 \3/p' "$logfile"
3 2 1

どちらも基本的に同じことを行います。行の最後の端(ただ)を一致させますが、数字をcreated filesキャプチャ(使用)して印刷するか、行をその行に置き換えます。(...)

答え3

コマンドを変更するには:

  • 出力に行の残りの部分を含めるに.*は、パターンに追加します。grep
  • -f3-3番目から最後まですべてのフィールドを選択するために使用されます。

-->

grep -o 'created files: .*' "$logfile" | cut -d\  -f3-

答え4

cut3以降のすべてのフィールドを抽出するために使用されます。

grep -o 'created files:' $logfile | cut -d" " -f3-

関連情報