【问题标题】:Get Specific Text in Bash Output在 Bash 输出中获取特定文本
【发布时间】:2018-05-29 05:57:31
【问题描述】:

我只想从此输出中获取 ip,但不知道如何。是否可以将输出限制为我想要的。

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)

【问题讨论】:

  • 你能复制粘贴图片的内容吗?谢谢
  • 我已经回答了你的第二个问题
  • @1995,尽量把所有问题放在一个帖子里。也请在您的帖子中添加您的努力,因为我们都在这里学习,干杯。
  • 给新手的建议:如果一个答案解决了您的问题,请点击旁边的大复选标记 (✓) 接受它,也可以选择投票(投票至少需要 15 个声望)点)。如果您发现其他答案有帮助,请给他们投票。接受和投票有助于未来的读者。请看【相关帮助中心文章】[1] [1]:stackoverflow.com/help/someone-answers

标签: linux bash awk sed grep


【解决方案1】:

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

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

【讨论】:

  • 很好,但您可以将grepawk 组合在一个命令中;-)
  • @sonali,欢迎来到 SO,请始终将您的代码包装在 CODE TAGS 中,{} 查找您的帖子的按钮,快乐学习并继续分享知识:)
  • 当然这样更好:)
【解决方案2】:

编辑: 因为 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

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

【讨论】:

    【解决方案3】:

    假设你有一个输入文件:

    $ 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 命令指定两个字段分隔符:|,并在到达包含VPN Server Hostname 的行时打印第二个字段

    【讨论】:

    • 谢谢。有用!你能解释一下代码的作用吗?我想了解它,以便我可以学习。
    • @1995:当然!!!我已经添加了一些解释,您是否有不清楚的具体部分?
    • 可能全部。哈哈哈。我将阅读有关 awk 和 sed 的信息并尝试学习它。再次感谢你。最后一个问题,如果ip介于两者之间怎么办。像这样,string1 192.168.1.1 string2.
    • @1995,请检查我的解决方案一次,我正在使用有关 IP 的正则表达式检查第二个字段,但由于您的要求不是那么明确,因此如果这些不明确,您可以让我们知道完整的问题不适合你。
    • @RavinderSingh13 我更新了我的问题。希望你能帮助我。
    【解决方案4】:

    这可能对你有用(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 地址由 1 到 3 位数字和句点匹配,出现 3 次后跟 1 到 3 位数字。下一个 sed 命令打印任何此类 IP 地址,最后一个命令删除 PS 中的第一行,无论它是否是 IP 地址。如果 PS 为空,则在D 命令之后,读取下一行,否则 sed 将再次循环执行命令。因此,这些命令的总体效果是在单独的行中列出所有 IP 地址。

    【讨论】:

    • 谢谢。我得到了我想要的。我还是 bash 的新手,所以我什至不明白你写的代码,但再次感谢你。
    • @1995 regexp 是一种小语言,它允许您验证、查找和替换字符串中的字符串。花几分钟时间,它们会在数小时后为您节省时间。
    • @potong 我研究了this reference,但是上面的代码我还是不太清楚。您能否添加逐步人类可读的解释?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2017-12-19
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2022-01-22
    • 2023-03-24
    相关资源
    最近更新 更多