我正在处理shell脚本。我想从文件名中提取日期。
文件名为:abcd_2014-05-20.tar.gz
我希望从中提取日期:2014-05-20
echo abcd_2014-05-20.tar.gz |grep -Eo '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}'
输出:
2014-05-20
grep
可以接受从 echo
标准输入中获取的内容,或者如果你将这些字符串存储在文件中,也可以使用 cat
命令。
-E
将 PATTERN 解释为扩展正则表达式。
-o
仅显示与 PATTERN 匹配的那一部分。
[[:digit:]]
它只会从输入中提取数字。
{N}
它将检查给定字符串中 N 个数字,例如:4 表示年份,2 表示月份和日期。
最重要的是,它可以在不使用任何分隔符(如“_”和“.”)的情况下提取信息。这就是为什么它是最灵活的解决方案。
echo 'abcd_2014-05-20.tar.gz' | awk -F '[_.]' '{print $2}'
2014-05-20
Use 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次),可以匹配您的日期。\d
,只需使用grep -oP '\d+-\d+-\d+'
即可。为了更准确,可以使用grep -oP '\d{4}-\d{2}-\d{2}'
。有些grep不支持P
,这种情况下请使用E
代替P
,如grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2}'
。 - Avinash Raj以下是更多例子:
cut
命令(与 awk
命令相比,cut
命令更易读)echo "abcd_2014-05-20.tar.gz" | cut -d "_" -f2 | cut -d "." -f1
输出结果为:
2014-05-20
grep
命令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
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来提取日期。
sed 's/^[^_]*_\|\..*//g'
即可。 - Avinash Rajls -l | grep ‘_[REGEXP]’
在这里,REGEXP是根据您的日期格式编写的正则表达式。
请看这里 http://www.linuxnix.com/2011/07/regular-expressions-linux-i.html
fdate=$(echo $f | grep -Eo '[[:digit:]]{4}[[:digit:]]{2}[[:digit:]]{2}')
- Mayur Gite