Bash

在 bash 中切片 grep 的輸出

  • February 8, 2019

我正在嘗試使用 bash 讀取一行文本,通過grep管道傳輸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

正是我想要它做的!

但是,如果我嘗試用 的前三個元素取出一個數組foo,我將無法讓它工作:

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

特別奇怪的是,行尾的最後兩個值實際上是第一行中包含selectin的兩個值file.txt(甚至不是該行的前兩個項目,而是第二個和第三個!),所以它們不應該甚至成為其中的一部分foo……

同樣,如果我嘗試簡單地從 中切出一個“單詞” foo,我會得到一個奇怪的輸出:

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

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

(同樣,最後一個值是不應該的值,據我所知,即使 in foo,它也是第一行的第二項selectin file.txt…)。

我需要了解發生了什麼,以及如何獲得我想要的輸出,即 array 0.47331 5.11188 13.1615

$foo不是數組;它是一個包含多個以空格分隔的單詞的字元串。如果您希望它是一個數組,請將其分配為一個:

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

現在你可以參考${foo[0]},或者前三個元素作為${foo[@]:0:3}

請注意,${foo[@]}它將包含最後一個匹配行中的所有五個元素,因為這裡沒有任何內容可以僅提取前三個元素。如果你願意,你可以用foo=("${foo[@]:0:3}")它來${foo[@]}縮小尺寸。

或者,如果您想創建僅包含前三個元素的數組,您可以awk像這樣使用:

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

引用自:https://unix.stackexchange.com/questions/498753