【问题标题】:How do I print date data with bash如何使用 bash 打印日期数据
【发布时间】:2015-01-11 22:28:33
【问题描述】:

我有这样的行:

20141114 15:15:15;/xx/yy/zz.../bla_bla_bla_201411131512.xxx.yyy.....;....

我需要这条线上的日期数据。我可以使用 awk 获取第一次日期数据(20141114):

awk '{print $1}'

如何使用 awk 或其他方式打印第二个 (201411131512) 日期值?

我需要打印 8 个以 201 开头的数字(只是 20141113)。

路径不是静态的,有时是bla_bla_201,有时是bla-bla-201,有时是201_bla_bla,等等...

【问题讨论】:

  • 显示更多示例数据,因为现在它看起来非常随机地排列在行中。
  • 数据不是静态的,这就是为什么我需要找到第一个 201 并打印 201 和 5 个数字之后 -> 20141113

标签: bash awk substring


【解决方案1】:

好像你想要这样的东西,

$ var="20141114 15:15:15;/xx/yy/zz.../bla_bla_bla_201411131512.xxx.yyy.....;...."
$ grep -oP '(?<!\d)201\d{5}' <<< "$var"
20141114
20141113

(?&lt;!\d)negative lookbehind 断言匹配不会以数字开头。

【讨论】:

  • @volkanasr 请注意,如果该行中有任何其他字符串以 201 开头,后跟 5 位数字,那么此解决方案也会打印它们。它不会像您所说的那样仅在行上打印第二个 201 字符串。
  • Ed,他想要所有日期字符串,而不仅仅是第二个。
  • @AvinashRaj 不,他特别说How can I print second (201411131512) date value。如果他对这个答案感到满意......
  • 他说,“我知道如何打印第一个但不知道如何打印第二个”?看来,他想打印两者。
  • @volkanasr 在包含20141114 15:15:15;/xx/yy/zz..6720112345..bla_201411131512.xxx.yyy..20112345.. 的输入行上尝试所有解决方案,如果您对结果感到满意,那么您可能已经找到了一个可行的解决方案。
【解决方案2】:

如果您需要在其后包含 201 和 5 数字的单词,则只需 grep 和一组数字即可:

$ grep -Eo '201[0-9]{5}' file
20141114
20141113

或

grep -o '201[0-9]\{5\}' 

-o 使输出只是行的匹配部分,而不是所有行。


如果它恰好是基于;分隔的第二字段指示的文件名中的数字:

IFS=";" read -r f1 f2 <<< "20141114 15:15:15;/xx/yy/zz.../bla_bla_bla_201411131512.xxx.yyy.....;"
$ echo $f2
/xx/yy/zz.../bla_bla_bla_201411131512.xxx.yyy.....

然后

$ basename "$f2" | grep -Eo '201[0-9]{5}'
20141113

basename 显示“文件名”,即最后一个/ 之后的所有内容。然后,我们得到201 后面的5 数字。

【讨论】:

    【解决方案3】:

    将 GNU awk 用于 gensub():

    $ awk '{print gensub(/.*[^0-9](201[0-9]{5}).*/,"\\1","",$2)}' file
    20141113
    

    您需要在201 之前的RE 段中包含[^0-9],以避免在6720112345 等数字中间出现错误匹配。

    【讨论】:

      【解决方案4】:

      你不需要使用 grep 或 awk

      我认为最好的方法是使用bash参数扩展

      像这样:

        my_date="20141114 15:15:15;/xx/yy/zz.../bla_bla_bla_201411131512.xxx.yyy.....;...."
      
        my_date="${my_date##*_}"            //trim from the head to the last '_'            
                                            my_date="201411131512.xxx.yyy.....;...." 
        my_date="${my_date%%.*}"            //trim from the tail to the last '.'
                                            my_date="201411131512"
        my_date="${my_date:0:8}"            //keep only the first 8 chars
                                            my_date="20141113"
      

      更多关于参数扩展的信息请看这里:Bash Parameter expansion

      【讨论】:

        【解决方案5】:

        这个gnu awk(由于RS中有多个字符)可能会:

        awk -v RS="201" -F. 'NR==3{print RS$1}' file
        201411131512
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-23
          • 2019-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多