使用Bash从文本文件中提取变量值

5

我正在使用 Linux 和 bash。 我有一个简单的文本文件如下:

VAR1=100
VAR2=5
VAR3=0
VAR4=99

我想用bash提取VAR2的值,即5。怎么做呢?

使用 grepcut - Barmar
或者只需使用awk,并将=作为字段分隔符。 - Barmar
1
或者 source simple_text_file; echo $VAR2 - Kenney
或者 sed -n 's/^VAR2=\([0-9]*\)$/\1/p' simple_text_file - Quinn
5个回答

7
假设文件名为vars.txt。
sed -n 's/^VAR2=\(.*\)/\1/p' < vars.txt

您可以使用单引号将值用于其他地方,如下所示:

`

echo VAR2=`sed -n 's/^VAR2=\(.*\)/\1/p' < txt`

sed -n 's/^VERSION=\(.*\)/\1/p' < vars.txt - sistematico
我不理解这些单引号中写的是什么。它们叫什么,有哪些好的教程可以学习? - Animesh Kumar
1
@AnimeshKumar 这是遵循此语法模式的 sed s 命令,其中包括 使用正则表达式s/regexp/replacement/ - user12345

5
最简单的方法可能是使用source或简单地使用.读取和执行文件。这将适用于您的示例,因为变量值中没有空格。否则,您需要使用grep + cut或awk,如其他答案所述。
. /path/to/your/file
echo $VAR2

如dawg所述,这将使你的脚本中的其他变量也可用,并可能覆盖现有变量。

1
他可能不想设置其他项目的值。source文件将所有变量设置为文件中的值... - dawg

2

给定:

$ echo "$txt"
VAR1=100
VAR2=5
VAR3=0
VAR4=99

你可以使用awk:
$ echo "$txt" | awk -F= '/^VAR2/ { print $2 }'
5

或者使用grep和cut:

$ echo "$txt"  | egrep '^VAR2=\d+' | cut -d = -f 2
5

在Bash中,您可以使用source将这些赋值的值插入到当前shell中,并筛选出您希望使用的行。在这种情况下,只有VAR2=5这一行将被使用。您需要将其写入文件,然后再对该文件进行源代码引用。
$ echo "$txt"  | grep '^VAR2' > tmp && source tmp && rm tmp
$ echo "$VAR2"
5

或者使用进程替换来消除tmp文件。在这里,您可以使用grepawk

$ source <(awk '/^VAR2/{print}' <<< "$txt")
$ echo "$VAR2"
5

1

假设这是您的文本文件,命名为test.txt

VAR2 = 5
VAR3 = 0
VAR4 = 99

你可以使用以下命令:cat test.txt | grep 'VAR2' | awk '{printf $3}'

然后你会得到输出结果:5

这里,cat test.txt 命令会在终端中显示 test.txt 文件的内容,grep 'VAR2' 命令会列出包含 'VAR2' 的行,awk '{printf $3}' 命令会打印变量的值。


1
那不起作用。你测试过了吗?在哪里?怎么测试的? - joanis
1
我想我弄错了。让我来纠正一下,谢谢你指出来。 - DAvinash97
抱歉,剩下的踩并不是我给的,我无法取消它。 - joanis

0
对于所描述的文件,您只需将文件作为Bash脚本源代码运行,它将执行其内容并使用更新后的工作区环境。例如:
source file.txt
echo $VAR2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接