我有一个文本文件,例如
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
答案 0 :(得分:1)
$ awk '/^server_ip/ {print $2}' file
1.1.1.1
这将选择以server_ip
开头的任何行,并在该行上打印第二个字段。
$ 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