从文件名获取目录名

从文件名获取目录名

我想通过提取文件名的一部分来创建目录名。这里有些例子:

  1. server.log.2016-03-20-1420160320
  2. server-2016-03-17-13-16-Restart.log20160317

我正在使用 HP-UX。

答案1

你可以使用 awk 来实现。

1)

echo server.log.2016-03-20-14 | awk -F'[.]' '{print $3}' | awk -F'[-]' '{print $1$2$3}'

2)

echo server-2016-03-17-13-16-Restart.log | awk -F'[-]' '{print $2$3$4}'

答案2

您可以使用 sed 将文件名传递给正则表达式检查:

echo server.log.2016-03-20-14 | sed 's/server\.log\.\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\1\2\3/g'

echo server-2016-03-17-13-16-Restart.log | sed 's/server-\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-Restart.log/\1\2\3/g'

如果您需要更严格的正则表达式,例如可以使用正则表达式描述月份

0[0-9]\|1[12]

日子是

0[1-9]\|[12][0-9]\|3[01]

答案3

您可以使用 shell 的字符串操作结构来完成此操作。这需要 POSIX shell,因此如果您运行的是旧版本的 HP-UX,您可能需要调用 POSIX shell(例如 ksh)而不是 Bourne shell。

您没有完全指定如何解析日期。我假设????-??-??每个??数字的第一个匹配项都是您想要的日期。

p=${0#*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]}
s=${0#"$p"}; p=${0%"$p"}
p=${p#"${p%??????????}"}
year=${p%??????}; p=${p#?????}
month=${p%???}; day=${p#???}
echo "$year$month$day"

不是最易读的代码,但它可以工作。

相关内容