숫자를 찾는 grep 표현식

숫자를 찾는 grep 표현식

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

host01.host.name
host02.host.name

.첫 번째 기호 인 01or 앞에 2개의 숫자 문자를 가져 02와서 변수에 할당하고 싶습니다 . 누군가 적절한 명령으로 나를 도울 수 있습니까?

답변1

grepPCRE 사용( -P):

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

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

  • (?=\.).너비가 0인 포지티브 미리보기 패턴으로 앞에 항목이 있는지 확인합니다.


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

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

이제 배열 요소를 반복하거나 일반적인 배열 액세스 방식으로 요소를 사용할 수 있습니다. 예를 들어 n번째 요소의 값을 가져오고 "${output[n]}", 모든 키의 모든 값을 가져오려면 use 를 사용합니다 "${output[@]}".


sed:

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

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

  • \..*a와 일치 .하고 나머지는 일치 합니다.

  • 대체에서는 캡처된 그룹만 \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(또는 -o다른 Grep의 경우)을 사용하여 출력을 필터링합니다.

답변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

관련 정보