bash - 解析日期和时间格式 - Bash

标签 bash parsing awk sed

我有这样的日期和时间格式(年月日):

20141105 11:30:00

我需要为变量分配年、月、日、小时和分钟值。

我可以像这样做到年、日、时:

year=$(awk '{print $1}' log.log | sed 's/^\(....\).*/\1/')
day=$(awk '{print $1}' log.log | sed 's/^.*\(..\).*/\1/')  
hour=$(awk '{print $2}' log.log | sed 's/^\(..\).*/\1/')  

我怎样才能按月和按分钟执行此操作?

--

我需要日志文件的每一行:

20141105 11:30:00 /bla/text.1
20141105 11:35:00 /bla/text.2
20141105 11:40:00 /bla/text.3
.... 

我尝试逐行读取此日志文件并执行此操作:

mkdir -p "/bla/backup/$year/$month/$day/$hour/$minute"
mv $file "/bla/backup/$year/$month/$day/$hour/$minute"

这是我不工作的代码:

#!/bin/bash
LOG=/var/log/LOG

while read line
do

year=${line:0:4}
month=${line:4:2}
day=${line:6:2}
hour=${line:9:2}
minute=${line:12:2}
file=$(awk '{print $3}')

if [ -f "$file" ]; then

printf -v path "%s/%s/%s/%s/%s" $year $month $day $hour $minute
mkdir -p "/bla/backup/$path"
mv $file "/bla/backup/$path"

fi
done < $LOG

最佳答案

你根本不需要调用awk to date,使用bash的子串操作

d="20141105 11:30:00"
yr=${d:0:4}
mo=${d:4:2}
dy=${d:6:2}
hr=${d:9:2}
mi=${d:12:2}
printf -v dir "/bla/%s/%s/%s/%s/%s/\n" $yr $mo $dy $hr $mi
echo "$dir"
/bla/2014/11/05/11/30/

或者直接,没有所有的变量。

printf -v dir "/bla/%s/%s/%s/%s/%s/\n" ${d:0:4} ${d:4:2} ${d:6:2} ${d:9:2} ${d:12:2}

给定你的日志文件:

while read -r date time file; do
    d="$date $time"
    printf -v dir "/bla/%s/%s/%s/%s/%s/\n" ${d:0:4} ${d:4:2} ${d:6:2} ${d:9:2} ${d:12:2}
    mkdir -p "$dir"
    mv "$file" "$dir"
done < filename

或者,假设您的文件名中没有空格或通配符:

sed -r 's#(....)(..)(..) (..):(..):.. (.*)#mv \6 /blah/\1/\2/\3/\4/\5#' | sh

关于bash - 解析日期和时间格式 - Bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26753757/

相关文章:

linux - 什么时候用引号括起 shell 变量?

linux - Bash 将 awk 的输出捕获到数组中

bash - 如何在CGI shell脚本中制作Uploader

r - 正确解析 R 中的 "formula"对象

scala - 如何实现单子(monad)解析?

linux - 命令 "echo"在 awk 中无效

python - 如果文件 1 中的 A 列不等于文件 2 中的 B 列,则删除行

bash - 使用 UNIX 批量重命名文件 - 我应该使用 awk 吗?

php - 如何从网页中获取内部链接?

Bash、Awk、Sed?在文件中查找字符串并在字符串中附加数字?