【问题标题】:Capturing string between 2 specific letters/words using shell scripting使用 shell 脚本捕获 2 个特定字母/单词之间的字符串
【发布时间】:2021-01-27 17:00:49
【问题描述】:

我正在尝试使用 sed/awk 捕获 2 个特定字母/单词之间的字符串。这就是我想要做的:

输入是一个文件test.log,包含

Owner: CN=abc.samplecerrt.com,o=IN,DC=com
Owner: CN=abc1.samplecerrt.com,o=IN,DC=com

我只想提取“CN=abc.samplecerrt.com”

我试过了

sed 's/.*CN=\(.*\),.*/\1/p' test.log >> result.log

但这会返回“abc.samplecerrt.com,o=IN,DC=com”

我该怎么做?

【问题讨论】:

    标签: string shell awk sed


    【解决方案1】:

    使用awk,您可以获得所需字符串所在的字段。对于它,你可以设置FS=:|,现在如果你运行

    awk -v FS=":|," '{print $2}' file
     CN=abc.samplecerrt.com
     CN=abc1.samplecerrt.com
    

    你得到了这个领域。但你只想要一个,所以

    awk -v FS=":|," '$2 !~ /abc1/ {print $2}' file
    
     CN=abc.samplecerrt.com
     
    

    【讨论】:

      【解决方案2】:

      这可能对你有用(GNU sed):

      sed -n 's/.*\(CN=[^,]*\).*/\1/p' file
      

      或者:

      sed 's/.*\(CN=[^,]*\).*/\1/p;d' file
      

      第一个关闭隐式打印-n,以便像grep一样。

      匹配并捕获字符串CN=,后跟零个或多个非逗号字符,如果匹配,则打印捕获的组\1

      第二种解决方案几乎相同,只是它删除了所有行并只打印上面捕获的组。

      【讨论】:

        【解决方案3】:

        测试文件:

        $ cat logs.txt
        CN=abc.samplecerrt.com,o=IN,DC=com Owner: CN=abc1.samplecerrt.com,o=IN,DC=com
        

        命令和输出:

        $ grep -oP 'CN=(?:(?!CN=).)*?.com' logs.txt
        CN=abc.samplecerrt.com
        CN=abc1.samplecerrt.com
        

        【讨论】:

          猜你喜欢
          • 2015-05-14
          • 2014-11-05
          • 2021-06-30
          • 1970-01-01
          • 1970-01-01
          • 2018-07-08
          • 1970-01-01
          • 2012-11-05
          • 1970-01-01
          相关资源
          最近更新 更多