2014-11-14 33 views
0

我行这样的:如何打印日期数据使用bash

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,等...

+1

显示更多样本数据,因为现在它看起来非常随机地放在线上。 – fedorqui 2014-11-14 13:53:51

+0

数据不是静态的,这就是为什么我需要找到第一个201和打印201和5号后 - > 20141113 – phe 2014-11-14 13:55:54

回答

1

好像你想是这样的,

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

(?<!\d)负回顾后发断言比赛不会以数字开头。

+0

是的,这是工作。谢谢。 – phe 2014-11-14 14:00:43

+0

不客气.. – 2014-11-14 14:01:23

+1

@volkanasr请注意,如果线路上有任何其他字符串以201开头,然后是5位数字,那么此解决方案也会打印它们。它不会像你所说的那样仅仅打印第201行字符串。 – 2014-11-14 14:16:03

1

如果您需要一个包含2015位后,然后就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数字。

0

使用GNU AWK的gensub():

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

您需要包括[^0-9]在RE段201之前,以避免在数字像6720112345中间得到错误的匹配。

0

你不需要使用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

0

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

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