shell:如何将某一行中的某一列读入变量

时间:2015-12-08 04:11:42

标签: shell

我想提取文本文件最后一行的第一列。而不是在另一个文件中输出感兴趣的内容并再次读取它,我可以直接使用一些命令将其读入变量吗? 例如,如果我的文件是这样的:

...  
123 456 789(this is the last line)  

我想要的是在我的shell脚本中将123读入变量。我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

一种方法是提取所需的行,将其列读入数组,然后发出所需的数组元素。

最后一行:

#!/bin/bash
#      ^^^^- not /bin/sh, to enable arrays and process substitution

read -r -a columns < <(tail -n 1 "$filename") # put last line's columns into an array
echo "${columns[0]}"                          # emit the first column

或者,awk是适合该工作的工具:

line=2
column=1
var=$(awk -v line="$line" -v col="$column" 'NR == line { print $col }' <"$filename")
echo "Extracted the value: $var"

也就是说,如果你正在寻找一个接近文件开头的行,它通常更快(在运行时性能意义上)并且更容易坚持shell内置。例如,要获取文件第二行的第三列:

{
  read -r _           # throw away first line
  read -r _ _ value _ # extract third value of second line
} <"$filename"

这可以通过使用_ s作为您不想阅读的值的占位符来实现。

答案 1 :(得分:0)

我想用&#34;第一列&#34;,你的意思是&#34;第一个字&#34;,对吗?

如果有保证,最后一行不以空格开头,你可以这样做

tail -n 1 YOUR_FILE | cut -d ' ' -f 1

答案 2 :(得分:0)

你也可以使用sed: $> var=$(sed -nr '$s/(^[^ ]*).*/\1/p' "file.txt")

-nr告诉sed默认情况下不输出数据(-n)并使用扩展正则表达式(-r以避免需要转义副词,否则你必须写\( \)))。 $是指定最后一行的地址。正则表达式使用第一个^锚定行的开头,然后匹配空格[^ ]*的所有内容,并将结果放入捕获组{{1然后通过用捕获组( )替换该行来删除行.*的其余部分,然后打印\1以打印该行。