【问题标题】:Remove extra dot in a String by grep/awk/cut通过 grep/awk/cut 删除字符串中的多余点
【发布时间】:2021-10-09 19:29:19
【问题描述】:

我在一个文件中有以下文本,例如 output.txt

[test.tracking_utils] INFO: Tracking subtool usage: main_test
[TEST & SPEC] INFO: Uploaded file test.zip with bucket URI test/20210804144418.zip.

如何使用 grep o 类似的东西来获取 test/20210804144418.zip 的值?

我试过了

tail output.txt | grep ". test/" | awk {print $NF}
tail output.txt | grep -m1 .test/ | rev | cut -d' ' -f1 | rev

它返回test/20210804144418.zip. 和额外的. 你知道如何在最后删除额外的. 吗?有什么建议吗?

【问题讨论】:

  • 生成output.txt 的脚本是什么样的?是可以更改的脚本吗?

标签: awk grep cut tail


【解决方案1】:

使用awk,您可以尝试关注一次。

awk '/test\//{sub(/\.$/,"");print $(NF);exit}' Input_file

第二个解决方案:在这里使用awkmatch函数。

awk 'match($0,/URI test\/[0-9]+\.zip/){print substr($0,RSTART+4,RLENGTH-4);exit}' Input_file

【讨论】:

    【解决方案2】:

    你可以使用这个grep:

    grep -oE -m1 'test/[^[:blank:]]+\.[^.]+' file
    
    test/20210804144418.zip
    

    正则表达式详细信息:

    • test/:匹配test/
    • [^[:blank:]]+:匹配 1+ 个非空白字符
    • \.:匹配一个点
    • [^.]+: 匹配 1+ 个非点字符

    【讨论】:

      【解决方案3】:

      您可以通过管道删除尾随 .

      sed 's/\.$//'
      

      但在这种情况下,这可能不是必需的。使用 GNU greppcregrep,您可以直接提取路径:

      grep -Po 'with bucket URI \K.*(?=.)'
      

      【讨论】:

        【解决方案4】:

        假设:

        • 所需输出/字符串的开头不一定以test 开头
        • 具有所需字符串的所有行都包含with bucket URI
        • 感兴趣的字符串始终是最后一个字段(以空格分隔)
        • 可能有不止一条感兴趣的线

        示例输入:

        $ cat output.txt
        [test.tracking_utils] INFO: Tracking subtool usage: main_test
        [TEST & SPEC] INFO: Uploaded file test.zip with bucket URI test/20210804144418.zip.
        [test.tracking_utils] INFO: Tracking subtool usage: main_test
        [TEST & SPEC] INFO: Uploaded file test.zip with bucket URI other/101423412.pre.zip.
        

        一对awk想法:

        awk '/with bucket URI/{sub(/\.$/,"",$NF);print $NF}' output.txt
        awk '/with bucket URI/{print substr($NF,1,length($NF)-1)}' output.txt
        

        这两个生成:

        test/20210804144418.zip
        other/101423412.pre.zip
        

        【讨论】:

          【解决方案5】:

          grep

          grep -o '[a-z]*\/[0-9].*\.[a-z]*\b'
          

          sed

          sed -n 's/^.*\s\([a-z]*\/[0-9].*\.[a-z]*\)./\1/p'
          

          awk

          awk '/\d+.[a-z]*/{print $NF}' | sed 's/\.//2'
          

          cut

          cut -d' ' -f11 | sed 's/\.//2'
          

          所有命令都应该产生您预期的输出。

          $ sed -n 's/^.*\s\([a-z]*\/[0-9].*\.[a-z]*\b\)./\1/p'
          test/20210804144418.zip
          

          【讨论】:

            猜你喜欢
            • 2019-10-20
            • 2016-09-30
            • 2013-03-01
            • 1970-01-01
            • 2022-01-18
            • 1970-01-01
            • 2018-11-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多