在Bash输出中获取特定文本

时间:2018-05-29 05:57:32

标签: linux bash awk sed grep

我想从这个输出中获取ip但是idk how.Is是否可以将输出限制为我想要的。

VPN Connection Setting Name                          |kap1
Destination VPN Server Host Name                     |159.89.199.192
Destination VPN Server Port Number                   |5252
Destination VPN Server Virtual Hub Name              |kap
Proxy Server Type                                    |Direct TCP/IP 

另一个问题。 ip有端口。我只想要ip。对不起,另一个问题。感谢大家的帮助。

VPN Connection Setting Name |kap1
Status                      |Connected
VPN Server Hostname         |159.89.199.192:5252 (Direct TCP/IP Connection)

4 个答案:

答案 0 :(得分:3)

考虑您共享的数据保存在文件中。 文件名:file.txt

$grep 'VPN Server Host Name' file.txt | awk -F '|' '{print $2}'
159.89.199.192

答案 1 :(得分:3)

编辑: 由于OP说OP有不同类型的Input_file,所以现在相应地添加解决方案。

awk '/Hostname/ && match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){print substr($0,RSTART,RLENGTH)}' Input_file

关注awk可能会对您有所帮助。

awk -F"|" '/Destination VPN Server Host Name/ && $2 ~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/{print $2}'  Input_file

OR

your_command | awk -F"|" '/Destination VPN Server Host Name/ && $2 ~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/{print $2}'

答案 2 :(得分:2)

想象一下你有一个输入文件:

$ cat vpn_info 
Item                                  |Value
--------------------------------------+--------
VPN Connection                        |kap1
Destination VPN Server Host Name      |159.89.199.192
Destination VPN Server Port Number    |5252
...
...

然后您可以使用以下命令之一:

<强> AWK:

awk -F '|' '/^Destination VPN Server Host Name/{print $2}' vpn_info                                                            
159.89.199.192

您将|定义为字段分隔符,然后在行以Destination VPN Server Host Name开头时打印输入的第二个字段

<强> SED:

sed -n 's/^Destination VPN Server Host Name *|//p' vpn_info 
159.89.199.192

您要求sed无效替换^Destination VPN Server Host Name *|,如果有效则打印结果。

第二次输入:

$ cat vpn_info 
Item                                  |Value
--------------------------------------+--------
VPN Connection                        |kap1
VPN Server Hostname                   |159.89.199.192:5252 (Direct TCP/IP Connection)

<强> AWK

$ awk -F '[:|]' '/VPN Server Hostname/{print $2}' vpn_info                                                         
159.89.199.192

您可以使用此awk命令指定2个字段分隔符:|,并在到达包含VPN Server Hostname的行时打印第2个字段

答案 3 :(得分:2)

这可能适合你(GNU sed):

sed -r '/\n/!s/([0-9]{1,3}\.){3}[0-9]{1,3}/\n&\n/;/^\S+[0-9]\n/P;D' file

按换行符覆盖所有IP地址,只打印匹配的字符串。

第一个正则表达式寻找换行符。换行符是sed用于分隔它放置在模式空间(PS)中的字符串的内容。因此,通常情况下,除非用户通过替换命令引入换行符,否则永远不会在PS中找到换行符。所以第一个命令说“除非模式空间中已经有新行,即已经进行了以下替换。围绕一个看起来像带有换行符的IP地址的字符串”。 IP地址匹配一到三个数字,后跟一个句点,发生三次,后跟一到三位数。下一个sed命令打印任何这样的IP地址,最后一个命令删除PS中的第一行,无论它是否是IP地址。如果PS为空,则按照D命令,读取下一行,否则再次循环执行命令。因此,命令的总体效果是在单独的行上列出所有IP地址。