我有这样的台词:
20141114 15:15:15;/xx/yy/zz.../bla_bla_bla_201411131512.xxx.yyy.....;....
我需要这一行的日期数据。我可以用awk做第一个日期数据(20141114):
awk '{print $1}'
如何以201411131512
或其他方式打印第二个(awk
)日期值?
我需要打印8个以201
开头的号码(仅20141113
)。
路径不是静态的,有时是bla_bla_201
,有时是bla-bla-201
,有时是201_bla_bla
等等。
答案 0 :(得分: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)
负面后卫声称匹配不会以数字开头。
答案 1 :(得分:1)
如果您需要包含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
显示“文件名”,即最后一个/
之后的所有内容。然后,我们得到5
后的201
位数。
答案 2 :(得分:0)
将GNU awk用于gensub():
$ awk '{print gensub(/.*[^0-9](201[0-9]{5}).*/,"\\1","",$2)}' file
20141113
您需要在[^0-9]
之前在RE细分中加入201
,以避免在6720112345
等数字中间出现错误匹配。
答案 3 :(得分: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
答案 4 :(得分:0)
此gnu awk
(由于RS中的多个字符)可能会:
awk -v RS="201" -F. 'NR==3{print RS$1}' file
201411131512