使用shell脚本从unix文件中提取信息

时间:2016-12-08 08:22:02

标签: shell unix

我有一个包含一些数据的下面文件

name:Mark
age:23
salary:100

我想只读取名称,年龄并分配给shell脚本中的变量

我如何实现这一目标

我能够通过使用以下脚本而不是特定数据来实现所有文件数据

#!/bin/bash

file="/home/to/person.txt" 

val=$(cat "$file")

echo $val  

请建议。

4 个答案:

答案 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\Kperl正则表达式的一部分。它充当断言并检查提供给它的文本是否存在。如果按照正则表达式打印,则忽略留给它的文本。

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的单个调用的输出,而不是运行多个readawk循环:

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