使用shell脚本从unix中的文件名中提取日期

时间:2014-11-12 07:04:25

标签: linux bash shell unix grep

我正在研究shell脚本。我想从文件名中提取日期。

文件名为:abcd_2014-05-20.tar.gz

我想从中提取日期:2014-05-20

6 个答案:

答案 0 :(得分:18)

echo abcd_2014-05-20.tar.gz |grep -Eo '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}'      

<强>输出:

2014-05-20

grep输入为echo stdin,或者如果文件中包含这些字符串,也可以使用cat命令。

-E将PATTERN解释为扩展正则表达式。

-o仅显示与PATTERN匹配的匹配行的部分。

[[:digit:]]它只会从输入中获取数字。

{N}它将检查给定字符串中的N位数,即: 4,数年2,数月和日

最重要的是,它会在不使用像&#34; _&#34;和&#34;。&#34;这就是它最灵活的解决方案。

答案 1 :(得分:9)

将awk与自定义字段分隔符一起使用,非常简单:

echo 'abcd_2014-05-20.tar.gz' | awk -F '[_.]' '{print $2}'
2014-05-20

答案 2 :(得分:6)

使用grep

$ ls -1 abcd_2014-05-20.tar.gz | grep -oP '[\d]+-[\d]+-[\d]+'
2014-05-20
  • -o导致grep仅打印匹配的部分
  • -P将模式解释为perl regex
  • [\d]+-[\d]+-[\d]+:代表一个或多个数字,后跟与您的日期匹配的短划线(3次)。

答案 3 :(得分:1)

我将使用某些正则表达式与&#34; grep&#34;命令,具体取决于文件名的创建方式。

如果您的日期始终在&#34; _&#34;之后char我会用这样的东西。

ls -l | grep ‘_[REGEXP]’

根据您的日期格式,REGEXP是您的正则表达式。

看看http://www.linuxnix.com/2011/07/regular-expressions-linux-i.html

答案 4 :(得分:1)

你可以采取多种方式:

echo abcd_2014-05-20.tar.gz | sed -n 's/.*_\(.*\).tar.gz/\1/p'

sed将提取日期并打印出来。

另一种方式:

filename=abcd_2014-05-20.tar.gz
temp=${filename#*_}
date=${temp%.tar.gz}

此处temp将文件名中的字符串保留为“_”,即2014-05-20.tar.gz 然后你可以从最后删除.tar.gz来提取日期。

答案 5 :(得分:1)

这里有几个例子,

  1. 使用cut命令(cut提供更多可读性,如awk命令)
  2. echo "abcd_2014-05-20.tar.gz" | cut -d "_" -f2 | cut -d "." -f1
    

    输出是:

    2014-05-20
    
    1. 使用grep commnad
    2. echo "abcd_2014-05-20.tar.gz" | grep -Eo "[0-9]{4}\-[0-9]{2}\-[0-9]{2}"
      

      输出是:

      2014年5月20日

      使用grep命令格式的另一个好处是,它还有助于获取这样的多个日期:

      echo "ab2014-15-12_cd_2014-05-20.tar.gz" | grep -Eo "[0-9]{4}\-[0-9]{2}\-[0-9]{2}"
      

      输出是:

      2014-15-12
      2014-05-20