我有一个包含一些数据的下面文件
name:Mark
age:23
salary:100
我想只读取名称,年龄并分配给shell脚本中的变量
我如何实现这一目标
我能够通过使用以下脚本而不是特定数据来实现所有文件数据
#!/bin/bash
file="/home/to/person.txt"
val=$(cat "$file")
echo $val
请建议。
答案 0 :(得分:1)
你可以试试这个
如果您的数据位于文件中:data.txt
name:vijay
age:23
salary:100
那么你可以使用像这样的脚本
#!/bin/bash
# read will read a line until it hits a record separator i.e. newline, at which
# point it will return true, and store the line in variable $REPLY
while read
do
if [[ $REPLY =~ ^name:.* || $REPLY =~ ^age:.* ]]
then
eval ${REPLY%:*}=${REPLY#*:} # strip suffix and prefix
fi
done < data.txt # read data.txt from STDIN into the while loop
echo $name
echo $age
输出
vijay
23
答案 1 :(得分:1)
使用grep
:\K
是perl
正则表达式的一部分。它充当断言并检查提供给它的文本是否存在。如果按照正则表达式打印,则忽略留给它的文本。
name=$(grep -oP 'name:\K.*' person.txt)
age=$(grep -oP 'age:\K.*' person.txt)
salary=$(grep -oP 'salary:\K.*' person.txt)
或者使用awk
一个班轮,如果包含额外:
的行,这可能会中断。
declare $(awk '{sub(/:/,"=")}1' person.txt )
将导致以下结果:
sh-4.1$ echo $name
Mark
sh-4.1$ echo $age
23
sh-4.1$ echo $salary
100
答案 2 :(得分:1)
您可以只运行一个grep
来读取bash
的单个调用的输出,而不是运行多个read
或awk
循环:
read age salary name <<< $(awk -F: '/^age/{a=$2} /^salary/{s=$2} /^name/{n=$2} END{print a,s,n}' file)
<强>结果
echo $age
23
echo $salary
100
echo $name
Mark
如果awk
脚本看到年龄,则会将a
设置为年龄。如果它看到薪水,则将s
设置为薪水。如果它看到名称,则会将n
设置为名称。在输入文件的末尾,它输出它为read
命令读取的内容。
答案 3 :(得分:0)
如果您可以将数据存储在json或其他类似的格式中,那么访问复杂数据将非常容易 data.json
{
"name":"vijay",
"salary":"100",
"age": 23
}
然后你可以使用jq解析json并轻松获取数据
jq -r '.name' data.json
vijay