Bash
在 bash 中切片 grep 的輸出
我正在嘗試使用 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
特別奇怪的是,行尾的最後兩個值實際上是第一行中包含
select
in的兩個值file.txt
(甚至不是該行的前兩個項目,而是第二個和第三個!),所以它們不應該甚至成為其中的一部分foo
……同樣,如果我嘗試簡單地從 中切出一個“單詞”
foo
,我會得到一個奇怪的輸出:[] echo "${foo[0]}" 0.47331 5.11188 13.1615 # select [] echo "${foo[1]}" 4.95294
(同樣,最後一個值是不應該的值,據我所知,即使 in
foo
,它也是第一行的第二項select
infile.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) )