Bashでのgrep出力の分割

Bashでのgrep出力の分割

grepファイルの最後の行を取得するには、パイプを使用して bash からテキスト行を読み込み、行の最初の 3 つのtail「単語」(スペースを使用して区切りなど) を配列要素に分割します。

出力の要素を繰り返そうとすると、うまく機能し、目的の要素のforリストが得られます。

[] foo=$(grep select file.txt | tail -n 1)
[] echo $foo
0.47331 5.11188 13.1615 # select

[] for x in $foo; do echo $x; done
0.47331
5.11188
13.1615
#
select

それが私がやりたいことです!

ただし、最初の3つの要素を含む配列を取り出そうとするとfoo機能しません。

[] echo "${foo[@]:0:2}"
0.47331 5.11188 13.1615 # select 4.95294 13.5177

特に奇妙なことは、行末の最後の2つの値が実際には最初selectfile.txtin(行の最初の2つの項目ではなく、2番目と3番目の項目!)を含む行なので、まったくfoo含まれてはいけません。

同様に、単に「単語」を切り取ろうとすると、foo奇妙な結果が出ます。

[] echo "${foo[0]}"
0.47331 5.11188 13.1615 # select

[] echo "${foo[1]}"
4.95294

(また、最後の値はあってはいけない値ですが、私の知る限りでもfoo最初の行の2番目の項目ですselect... file.txt)。

何が起こっているのか、私が望む出力(配列)を取得する方法を理解する必要があります0.47331 5.11188 13.1615

ベストアンサー1

$foo配列ではなく、スペースで区切られた複数の単語を含む文字列。配列にするには、次のように指定します。

foo=( $(grep 'select' file.txt | tail -n 1) )

${foo[0]}これで、または最初の3つの要素をとして参照できます${foo[@]:0:3}

${foo[@]}これには最初の3つの要素のみを抽出できるものがないため、これには最後の一致行の5つの要素がすべて含まれます。必要に応じてサイズに合わせてfoo=("${foo[@]:0:3}")カットして使用できます。${foo[@]}

または、最初の3つの要素のみを含む配列を作成するには、awk次のように使用できます。

foo=( $(awk '/select/ { a=$1; b=$2; c=$3 } END { print a,b,c }' file.txt) )

おすすめ記事