如何编写shell脚本以从文本文件中的key:value对中获取值?

时间:2016-07-22 00:02:46

标签: shell

我有一个文本文件,例如

server_ip: 1.1.1.1
server_port: 123

如何编写一个linux shell脚本,它将根据server_ip键为我提供值。

示例文件

[LOGGER]
server_ip: 1.1.1.1
server_port:123
#many such blocks as shown above

2 个答案:

答案 0 :(得分:1)

原始问题的答案

使用awk:

$ awk '/^server_ip/ {print $2}' file
1.1.1.1

这将选择以server_ip开头的任何行,并在该行上打印第二个字段。

使用sed:

$ sed -n 's/server_ip: //p' file
1.1.1.1

这会尝试从一行中删除server_ip:,并仅打印替换成功的那些行的输出。

使用grep -P(需要GNU grep):

$ grep -oP '(?<=server_ip: ).*' file
1.1.1.1

这使用Perl风格的look-behind选择server_ip:后的文本。

修订问题的答案

让我们考虑一下这个测试文件:

$ cat file
[GOG]
server_ip: 2.2.2.2
server_port: 123
[LOGGER]
server_ip: 1.1.1.1
server_port: 123
[FOG]
server_ip: 3.3.3.3
server_port: 123

使用awk:

$ awk '/LOGGER/,/^server_ip/{if (/^server_ip/) print $2}' file
1.1.1.1

使用sed:

$ sed -n '/LOGGER/,/^server_ip/{s/server_ip: //p}' file
1.1.1.1

将输出分配给变量

屏幕上stdout上显示的输出可以使用命令替换捕获到变量,该命令看起来像$(...)。因此:

ip="$(awk '/^server_ip/ {print $2}' file)"

或者:

ip="$(sed -n 's/server_ip: //p' file)"

或者:

ip="$(grep -oP '(?<=server_ip: ).*' file)"

答案 1 :(得分:-1)

你的问题不是很清楚。如果您正在寻找基于ip的端口,那么您可以使用一个小脚本来实现此目的。 的输入

$ cat file
[GOG]
server_ip: 2.2.2.2
server_port: 123
[LOGGER]
server_ip: 1.1.1.1
server_port: 123
[FOG]
server_ip: 3.3.3.3
server_port: 123

<强>脚本

#!/bin/bash
if [ -z "$1" ]
then
echo "Usage : command server_name"
exit 1
fi
sed -n "/$1/{n;N;p;q}" file

正在运行

$ ./script LOGGER
server_ip: 1.1.1.1
server_port: 123