【问题标题】:grep regex how to get only results with one preceeding word?grep regex 如何仅使用一个前面的单词获得结果?
【发布时间】:2022-01-16 22:39:39
【问题描述】:

我的字符串是:

www.abc.texas.com
mail.texas.com
subdomain.xyz.cc.texas.com
www2.texas.com

我试图在 texas.com 之前只使用“一个”字来获得结果。当我执行正则表达式 grep 时的期望:

mail.texas.com
www2.texas.com

所以邮件和 www2 是我所说的“一个”词。我试过了:

grep "*.texas.com",但我在结果中得到了所有这些。有人可以帮忙吗?

【问题讨论】:

    标签: regex bash shell grep subdomain


    【解决方案1】:

    你可以使用

    grep '^[^.]*\.texas\.com'
    

    详情:

    • ^ - 字符串开头
    • [^.]* - 除了 . 字符之外的零个或多个字符
    • \.texas\.com - .texas.com 字符串(文字 . char 必须在正则表达式模式中进行转义)。

    见online demo:

    #!/bin/bash
    s='www.abc.texas.com
    mail.texas.com
    subdomain.xyz.cc.texas.com
    www2.texas.com'
    grep '^[^.]*\.texas\.com' <<< "$s"
    

    输出:

    mail.texas.com
    www2.texas.com
    

    【讨论】:

      【解决方案2】:

      awk:

      awk 'BEGIN{FS=OFS="."} /texas.com$/ && NF==3' file
      

      输出:

      mail.texas.com www2.texas.com

      设置一个点作为输入和输出字段分隔符,检查行尾的texas.com ($) 并检查三个字段。

      见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

      【讨论】:

        【解决方案3】:

        使用您展示的示例,请尝试关注awk 代码。

        awk -F'.' 'NF==3 && $2=="texas" && $3=="com"'  Input_file
        

        说明: 将awk 程序中所有行的字段分隔符简单地设为.。然后在主程序检查条件中,如果 NF==3(表示当前行中的字段数)为 3,并且第二个字段为texas,第三个字段为com,如果所有 3 个条件都满足,则打印该行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-11
          • 2021-05-24
          • 2014-06-03
          • 1970-01-01
          • 2012-07-25
          相关资源
          最近更新 更多