명령으로 출력된 다음 문자열에서 숫자를 어떻게 추출할 수 있습니까?

명령으로 출력된 다음 문자열에서 숫자를 어떻게 추출할 수 있습니까?

명령을 실행할 때 받는 메시지 번호를 추출하고 싶습니다 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

이 시도 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

관련 정보