使用shell脚本从UNIX中的文件名提取date

我正在处理shell脚本。 我想从文件名提取date。

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

我想从中提取date: 2014-05-20

Solutions Collecting From Web of "使用shell脚本从UNIX中的文件名提取date"

 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年),数月和数天

最重要的是,它将获取不使用任何分隔符,如“_”和“。 这就是为什么它是最灵活的解决方案。

使用带有自定义字段分隔符的awk,这非常简单:

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

使用grep

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

我将用“grep”命令使用某种正则表达式,具体取决于您的文件名是如何创建的。

如果你的日期总是在“_”字符之后,我会使用类似这样的东西。

 ls -l | grep '_[REGEXP]' 

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

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

多种方式可以做到这一点:

 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} 

这里温度将持有字符串文件名称后“_”即2014-05-20.tar.gz然后,您可以通过从最后删除.tar.gz提取日期。

这里再举几个例子,

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

输出是:

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

输出是:

二零一四年五月二十零日

使用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