호스트 이름에서 숫자를 찾고 싶습니다. 일반적으로 서버의 호스트 이름은 다음과 같습니다.
host01.host.name
host02.host.name
첫 번째 기호 앞에 2개의 숫자 문자를 가져오거나 변수에 할당 .
하고 싶습니다 . 적절한 명령을 내리는 데 도움을 줄 수 있는 사람이 있나요?01
02
답변1
grep
PCRE( -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