コマンドで出力された次の文字列から数値をどのように抽出できますか?

コマンドで出力された次の文字列から数値をどのように抽出できますか?

コマンドの実行時に受信したメッセージ番号を抽出したいと思いますmailx -H。未読メッセージと新しいメッセージのメッセージ番号のみが必要です。次のコマンドを試してみました。

mailx -H|grep '^ [UN]'|cut -c 3-

ただし、目的の出力を提供しません。 U または N の後に行全体を提供します。 mailx -H コマンドの出力例は次のとおりです。

O 95 abcd Thu Sep  6 20:29   25/1245  Incident: 00291
O 96 efgh Thu Sep  6 20:29   25/1245  Incident: 00291
O 97 abcd  Thu Sep  6 20:29   25/1245 Incident: 00291
O 98 pqrs Thu Sep  6 20:29   25/1245  Incident: 00291
O 99 abcd  Thu Sep  6 20:29   25/1245 Incident: 00291
U100 cnhn Thu Sep  6 20:29   25/1244  Incident: 00291
U101 gont Thu Sep  6 20:29   25/1244  Incident: 00291
U102 qwer Thu Sep  6 20:29   25/1244  Incident: 00291

UまたはNの後の数字、つまり新しいメッセージまたは未読メッセージとO(以前)メッセージが必要です。シェルスクリプトでこれを行うにはどうすればよいですか?予想される出力は次のとおりです。

95
96
97
98
99
100
101
102

答え1

この試み、

mailx -H | nawk -F '[^0-9]+' '/^ [U|N]/ { print $2}' 
  • [^0-9]+FSとして。
  • Uまたはで始まる行の抽出N
  • 2番目のフィールドの印刷

答え2

この試みgrep

grep -P -o '(?<=O|U|N) ?[0-9]+'

例:

echo "O 95 abcd Thu Sep  6 20:29   25/1245  Incident: 00291
O 96 efgh Thu Sep  6 20:29   25/1245  Incident: 00291
O 97 abcd  Thu Sep  6 20:29   25/1245 Incident: 00291
O 98 pqrs Thu Sep  6 20:29   25/1245  Incident: 00291
O 99 abcd  Thu Sep  6 20:29   25/1245 Incident: 00291
U100 cnhn Thu Sep  6 20:29   25/1244  Incident: 00291
U101 gont Thu Sep  6 20:29   25/1244  Incident: 00291
U102 qwer Thu Sep  6 20:29   25/1244  Incident: 00291" | grep -P -o '(?<=O|U|N) ?[0-9]+'
 95
 96
 97
 98
 99
100
101
102

-

grep --version
grep (GNU grep) 2.27

上記の方法がうまくいかないか十分でない場合は、grep次のことを試してくださいsed

sed -E 's/^(O|U|N) ?([0-9]+) .*/\2/g'

例:

echo "O 95 abcd Thu Sep  6 20:29   25/1245  Incident: 00291
O 96 efgh Thu Sep  6 20:29   25/1245  Incident: 00291
O 97 abcd  Thu Sep  6 20:29   25/1245 Incident: 00291
O 98 pqrs Thu Sep  6 20:29   25/1245  Incident: 00291
O 99 abcd  Thu Sep  6 20:29   25/1245 Incident: 00291
U100 cnhn Thu Sep  6 20:29   25/1244  Incident: 00291
U101 gont Thu Sep  6 20:29   25/1244  Incident: 00291
U102 qwer Thu Sep  6 20:29   25/1244  Incident: 00291" | sed -E 's/^(O|U|N) ?([0-9]+) .*/\2/g'
95
96
97
98
99
100
101
102

関連情報