我正在研究shell脚本。我想从文件名中提取日期。
文件名为:abcd_2014-05-20.tar.gz
我想从中提取日期:2014-05-20
答案 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)
这里有几个例子,
cut
命令(cut提供更多可读性,如awk
命令)echo "abcd_2014-05-20.tar.gz" | cut -d "_" -f2 | cut -d "." -f1
输出是:
2014-05-20
grep
commnad 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