Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用bash打印日期数据_Bash_Awk_Substring - Fatal编程技术网

如何使用bash打印日期数据

如何使用bash打印日期数据,bash,awk,substring,Bash,Awk,Substring,我有这样的台词: 20141114 15:15:15;/xx/yy/zz.../bla_bla_bla_201411131512.xxx.yyy.....;.... 我需要这行的日期数据。我可以使用awk获取第一个日期数据(20141114): 如何使用awk或其他方式打印秒(201411131512)日期值 我需要打印以201开头的8个数字(只需20141113) 路径不是静态的,有时是bla_-bla_201,有时是bla-bla-201,有时是201_-bla_-bla,等等..似乎你想

我有这样的台词:

20141114 15:15:15;/xx/yy/zz.../bla_bla_bla_201411131512.xxx.yyy.....;....
我需要这行的日期数据。我可以使用awk获取第一个日期数据(20141114):

如何使用
awk
或其他方式打印秒(
201411131512
)日期值

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


路径不是静态的,有时是
bla_-bla_201
,有时是
bla-bla-201
,有时是
201_-bla_-bla
,等等..

似乎你想要这样的东西

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

$grep-oP'(?如果您需要包含
201
5
数字的单词,则只需
grep
和一组数字:

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

-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
显示“文件名”,即最后一个
/
之后的所有内容。然后,我们使用GNU awk for gensub()获得
201
之后的
5
数字:


<代码> > 201 之前,在RE段中必须包含<代码> [^ 0 9] < />代码,以避免在“代码< 6720112345 > /代码>的编号中间获得错误匹配。

< p>不需要使用GRIP或AWK < /P> 我认为最好的方法是使用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"
有关参数扩展的更多信息,请参见此处:

gnu awk
(由于RS中有多个字符)可能执行以下操作:


显示更多示例数据,因为现在它看起来非常随机地放置在行中。数据不是静态的,这就是为什么我需要查找第一个201并打印201,然后打印5号->20141113@volkanasr请注意,如果行中有任何其他字符串以201开头,后跟5位数字,则此解决方案也会打印这些字符串。它不会只打印第2个20正如你所说的,行中有1个字符串。Ed,他想要所有的日期字符串,而不仅仅是第二个。@AvinashRaj不,他特别说
我如何打印第二个(201411131512)日期值
。如果他对这个答案满意,他会说,“我知道如何打印第一个,但不知道如何打印第二个”?似乎,他想同时打印这两个。@volkanasr在包含
20141114 15:15:15;/xx/yy/zz..6720112345..bla_201411131512.xxx.yyy..20112345..
的输入行上尝试所有解决方案,如果您对结果满意,那么您可能已经找到了一个可行的解决方案。
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
$ awk '{print gensub(/.*[^0-9](201[0-9]{5}).*/,"\\1","",$2)}' file
20141113
  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"
awk -v RS="201" -F. 'NR==3{print RS$1}' file
201411131512