ホスト名に数字が含まれているかどうかを確認したいのですが、通常、サーバーのホスト名は以下のようになります。
host01.host.name
host02.host.name
.
最初の記号「または」01
の前の 2 つの数字文字を取得して02
、それを変数に割り当てたいです。適切なコマンドを教えてもらえますか。
答え1
grep
PCRE ( -P
) の場合:
grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt
^[^\d.]*
.
先頭から最初の数字の前の部分と一致し、数字の前に何もないことも確認し、\K
一致を破棄します。\d+
1つ以上の数字に一致する(?=\.)
ゼロ幅の正の先読みパターンであり、.
前に
出力は複数あるため、配列に保存することをお勧めします。
output=( $(grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt) )
これで、配列要素を反復処理したり、通常の配列アクセス方法で使用したりできます。たとえば、n 番目の要素の値を取得するには を使用し"${output[n]}"
、すべてのキーのすべての値を取得するには を使用します"${output[@]}"
。
sed
:
sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt
grep
1と同様に、先頭から最初の数字の前の部分と一致し、数字の前に^[^[:digit:].]*
何もないことも確認します。.
([[:digit:]]+)
1つ以上の数字と一致し、キャプチャされたグループ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