我想在主機名稱中尋找數字。通常伺服器的主機名稱如下所示
host01.host.name
host02.host.name
我想獲取第一個符號 or 之前的 2 個數字字符,.
並將01
其02
分配給變數。有人可以幫我提供合適的命令嗎?
答案1
grep
與 PCRE ( -P
):
grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt
^[^\d.]*
.
匹配從開始的第一個數字之前的部分,同時確保數字之前沒有,\K
丟棄匹配\d+
匹配一位或多位數字(?=\.)
是零寬度正前瞻模式,確保.
前面有
由於會有多個輸出,您最好將它們保存在陣列中:
output=( $(grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt) )
現在您可以迭代數組元素或透過通常的數組存取方式使用它們,例如取得第 n 個元素的值 use "${output[n]}"
,取得所有鍵的所有值 use "${output[@]}"
。
sed
:
sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt
與
grep
一個類似,匹配從開始的第一個數字之前的部分,同時確保數字之前^[^[: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