grep 表達式查找一個數字

grep 表達式查找一個數字

我想在主機名稱中尋找數字。通常伺服器的主機名稱如下所示

host01.host.name
host02.host.name

我想獲取第一個符號 or 之前的 2 個數字字符,.並將0102分配給變數。有人可以幫我提供合適的命令嗎?

答案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

相關內容