数値を検索するgrep式

数値を検索するgrep式

ホスト名に数字が含まれているかどうかを確認したいのですが、通常、サーバーのホスト名は以下のようになります。

host01.host.name
host02.host.name

.最初の記号「または」01の前の 2 つの数字文字を取得して02、それを変数に割り当てたいです。適切なコマンドを教えてもらえますか。

答え1

grepPCRE ( -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
  • grep1と同様に、先頭から最初の数字の前の部分と一致し、数字の前に^[^[: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

関連情報