숫자를 찾는 grep 표현식

숫자를 찾는 grep 표현식

호스트 이름에서 숫자를 찾고 싶습니다. 일반적으로 서버의 호스트 이름은 다음과 같습니다.

host01.host.name
host02.host.name

첫 번째 기호 앞에 2개의 숫자 문자를 가져오거나 변수에 할당 .하고 싶습니다 . 적절한 명령을 내리는 데 도움을 줄 수 있는 사람이 있나요?0102

답변1

grepPCRE( -P) 사용:

grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt
  • ^[^\d.]*.처음부터 첫 번째 숫자 이전 부분과 일치합니다. 그 앞에 숫자가 없는지 확인하고 \K일치 항목을 삭제합니다 .

  • \d+하나 이상의 숫자 일치

  • (?=\.)너비가 0인 긍정적인 예측 모드입니다 ..


여러 개의 출력이 있으므로 배열에 저장하는 것이 좋습니다.

output=( $(grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt) )

이제 배열 요소를 반복하거나 n번째 요소의 값 가져오기 use "${output[n]}", 모든 키에 대한 모든 값 가져오기 use 와 같은 일반적인 배열 액세스 방법을 통해 이를 사용할 수 있습니다 "${output[@]}".


sed:

sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt
  • one 과 유사하게 grep, 처음부터 첫 번째 숫자 앞의 부분을 일치시키며, 앞에 숫자 ^[^[:digit:].]*가 없는지 확인합니다..

  • ([[:digit:]]+)하나 이상의 숫자를 일치시켜 캡처된 그룹 1에 넣습니다.

  • \..*을 일치시킨 .다음 나머지를 일치시키십시오.

  • 교체에는 \1캡처된 그룹만 사용


예:

$ cat file.txt
host01.host.name
host02.host.name

$ grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt
01
02

$ sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt
01
02

답변2

$ echo host01.host.name | grep --only-matching '[0-9]*'
01

일치를 위해 기본 정규식을 사용 하고 출력을 필터링하기 위해 [0-9]*GNU Grep --only-matching(또는 다른 Grep)을 사용합니다.-o

답변3

echo "host01.host.name host02.host.name" | sed 's/\..*//;s/[^0-9]*//'

아니면 당신을 위해;

hostname | sed 's/\..*//;s/[^0-9]*//'

대체 솔루션:

echo "host01.host.name host02.host.name" | grep -o "[0-9]*" | head -1

아니면 당신을 위해;

hostname | grep -o "[0-9]*" | head -1

관련 정보