호스트 이름에서 숫자를 찾고 싶습니다. 일반적으로 서버의 호스트 이름은 다음과 같습니다.
host01.host.name
host02.host.name
.
첫 번째 기호 인 01
or 앞에 2개의 숫자 문자를 가져 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번째 요소의 값을 가져오고 "${output[n]}"
, 모든 키의 모든 값을 가져오려면 use 를 사용합니다 "${output[@]}"
.
sed
:
sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt
grep
1 과 유사하며 , 시작 부분의 첫 번째 숫자 이전 부분과 일치하며, 숫자 앞에 숫자^[^[: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