次のようなファイルの行があります。
attempting to create a 512^3 level (with Dirichlet BC) using a 16^3 grid of 32^3 boxes and 800 tasks...
512^3
、16^3
、32^3
および800
から4つの数値を抽出して、それぞれ4つの変数level
、grid
、boxes
およびtasks
他の用途。
これどうやってするの?
Bashは=~
演算子[[ ... ]]
:
#! /bin/bash
line='attempting to create a 512^3 level (with Dirichlet BC) using a 16^3 grid of 32^3 boxes and 800 tasks...'
num='([0-9^]+)'
nonum='[^0-9^]+'
if [[ $line =~ $num$nonum$num$nonum$num$nonum$num ]] ; then
level=${BASH_REMATCH[1]}
grid=${BASH_REMATCH[2]}
boxes=${BASH_REMATCH[3]}
tasks=${BASH_REMATCH[4]}
echo "Level $level, grid $grid, boxes $boxes, tasks $tasks."
fi
これがあなたが書いたプログラム/スクリプトからの出力であり、テキストが定型的である場合(つまり、このパターンに正確に従う)、cut
を使用できます。
#!/bin/bash
$STRING='attempting to create a 512^3 level (with Dirichlet BC) using a 16^3 grid of 32^3 boxes and 800 tasks...'
level=$(echo $STRING | cut -d' ' -f5 -)
grid=$(echo $STRING | cut -d' ' -f12 -)
boxes=$(echo $STRING | cut -d' ' -f15 -)
tasks=$(echo $STRING | cut -d' ' -f18 -)
Awkの使用:
awk '{print "level="$5"\n""grid="$12"\n""boxes="$15"\n""tasks="$18}' file
level=512^3
grid=16^3
boxes=32^3
tasks=800
行が常にこの構造を持っている場合、 read
は、外部プロセスなしで1行でこれを実行できます。
read x x x x level x x x x x x grid x x boxes x x tasks x <<<"$line"
( herestring も使用)。これにより、不要なすべての単語がx
(無視される)に保存され、必要な値がそれぞれの変数に保存されます。