【问题标题】:Bash, cut word with dot character from stringBash,从字符串中剪切带有点字符的单词
【发布时间】:2017-11-14 22:04:59
【问题描述】:

我有一个字符串:

登录:squid.log.2017.11.13

我需要剪掉squid.log. 以便我看到:

登录时间:2017.11.13

我试过cut

echo "Log for: squid.log.2017.11.13" | cut -d'.' -f3-5

但我最终得到了:

2017.11.13

我怎样才能得到我想要的结果?

【问题讨论】:

  • 是字面意义上的“squid.log.”,还是可以是 year.month.day 之前的任何文本?
  • 总是squid.log

标签: bash shell awk sed grep


【解决方案1】:

awk 来救援!打破单调的非标准方法...

将要删除的文本定义为字段分隔符并解析并打印输入行。

$ echo Log for: squid.log.2017.11.13 | awk -F' squid\\.log\\.' '{$1=$1}1'

Log for: 2017.11.13

【讨论】:

    【解决方案2】:

    使用sed删除想要的部分:

    echo "Log for: squid.log.2017.11.13" | sed 's/squid\.log\.//'
    

    【讨论】:

      【解决方案3】:

      您可以使用sed 剪切不需要的部分:

      echo "Log for: squid.log.2017.11.13" | sed 's/squid\.log\.//'
      

      【讨论】:

        【解决方案4】:

        此解决方案比以前提供的解决方案更具可重用性:

        awk '/^Log/{ split($3,x,"."); print $1" "$2" "x[length(x)-2]"."x[length(x)-1]"."x[length(x)] };'
        

        这会查找以Log 开头的所有行,然后抓取包含squid.log.2017.11.13 的第三列,并利用split 内置函数将字符串分解为数组x,使用.作为分隔符。一旦我们有了数组x,我们就知道最后3个值总是日期,不管字符串的其余部分如何,这都会起作用(即使squid.log是不同的)——我们可以使用@ 987654329@ 内置确保我们只得到最后三个元素。

        然后我们只打印重新格式化的字符串print $1" "$2" "x[length(x)-2]"."x[length(x)-1]"."x[length(x)] - 在适当的位置重新插入.,因为它们被用作split 分隔符而被剥离。

        输出: Log for: 2017.11.13

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-30
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          相关资源
          最近更新 更多