2017-05-04 105 views
3

我需要的bash腳本接受日期格式字符串(「的strftime」格式),例如:檢查字符串匹配給定的日期,就像格式

< < [%Y-%間%d%H:%M:%S] >>

然後檢查在我的輸入文件數據(左值)是否該給定的字符串匹配或不:

格式字符串:< < [%Y-%間 - %d%H:%M:%S] >>
數據文件:
< < [2017年5月4日14點49分18秒] >> 12.1 - 有效
< [2017年5月4日14點49分18秒]> -1421 - 無效
< < [2017年5月4日14點49分18秒] >> 1231231.02 - 無效

的輸入文件有很多行,我唯一想到的就是使用Python:

function check_time_format() { 
    python -c "import time; 
time.strptime(\"$1\",\"$2\")" 2> /dev/null 
} 

while read -r lvalue rvalue; do 
    check_time_format "$lvalue" "$TIMEFORMAT" 
    [[ $? != 0 ]] && echo "Invalid format..." 
done < "$file" 

它有效,但它當然非常慢。有沒有更好的方法來做到這一點,可能就像容易?

謝謝!

+1

您可以改爲使用'date --date = [my_string]'命令來解析時間戳。如果無法解析日期,則返回非零值,否則返回格式化的日期。 – amphetamachine

+1

我需要有可能使用任何字符的字符串,例如:blabla%Y:%Mblabla。你的解決方案無法幫助我實現我的想法。 – PesaThe

回答

0

在我使出結束到我想避免的解決方案。我只是讓python處理整個文件而不是bash。

0

我能想到這樣做的最簡單的方法是使用date解釋,然後重新格式化給定格式的日期,然後比較它與原來的輸入:

is_in_format() { 
    local fmt="$1" datestring="$2" 
    if [ ! "x$(date "+$fmt" --date="$datestring")" = "x$datestring" ]; then 
     echo "Unrecognized date format: $datestring - use format $fmt" >&2 
     return 2 
    fi 
    return 0 
} 

is_in_format "%F" '2017-06-01' # true 
is_in_format "%F %H:%M" '2017-06-01' # false 
+0

問題是我需要接受像這樣的東西:'is_in_format「[[%Y-%m - 這是日期]]''[[2014-10 - 這是日期]]''但日期不接受作爲一個有效的日期。 – PesaThe