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