メールログに次の正規表現パターンを印刷しようとしています。特に角かっこの間でIDを取得しようとしています(参照のために2行目を参照)。
Mar 29 03:48:13 mx-150 clamsmtpd: 14114F: accepted connection from: 127.0.0.1
Mar 29 03:48:13 mx-150 postfix/smtpd[7445]: connect from unknown[127.0.0.1]
Mar 29 03:48:13 mx-150 spamd[15674]: prefork: child states: II
次のコマンドを使用します。
awk '/\[\d+\]/ { print }' maillog
~によるとhttps://regex101.com/r/pL7kN2/11つの一致を得ましたが、awkは何も返しません。なぜそんなことですか?
答え1
perl
(正規表現の代わりに)標準正規表現を試してください。これにより、一致する行が印刷されます。
awk '/\[[[:digit:]]+\]/ { print }' maillog
括弧内に一致する値を抽出して印刷するには、次のようにします。
awk 'match($0,/\[[[:digit:]]+\]/) { print substr($0,RSTART+1,RLENGTH-2)}' maillog
答え2
別の方法:
awk -F'[][]' 'NR>1{print $2}' maillog
7445
15674
答え3
次のスクリプトが好きなら、awk
文字列が[]
(内部を意味する)で分割されたら、他のすべてのフィールドを印刷します。
awk -F [][] '{for(i=2;i<=NF;i+=2)print $i}' maillog
grep
しかし、もっと簡単な方法で同じことをしてください。
grep -o '\[[^]]*\]' maillog
答え4
何とペアリングしたいかによって異なります。
awk -F"[][]" '/postfix|spamd/{print $2}' maillog