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

  • 本文关键字:变量 一列 shell 一行 shell
  • 更新时间 :
  • 英文 :


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

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

我想要的是将 123 读入我的 shell 脚本中的一个变量。我该怎么做?

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

对于最后一行:

#!/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 作为您不想读取的值的占位符来工作。

我想"第一列"的意思是"第一个单词",是吗?

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

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

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

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

最新更新