我有strftime格式的时间,比方说(%Y-%m-%d %H:%M:%S)
和一个应包含此类数据的文件,例如(2012-02-11 17:15:00)
。我需要检查给定的模式是否与数据匹配。
怎么解决这个问题? awk,约会?
修改 更多信息:用户输入strftime格式,让我们说输入。然后他输入一个应包含这些日期的文件。我需要确保这些数据是有效的(他没有犯错误)。所以我需要检查输入文件中的行,看看是否有与给定模式匹配的数据。例如:
用户输入strftime格式:(%Y-%m-%d %H:%M:%S)
输入文件:(2012-02-11 17:15:00) long sentence
的 VALID
用户输入strftime格式:Date[%Y.%m.%d %H:%M:%S]
输入文件:Date-2012.02.11 17:15:00- long sentence
的 INVALID
答案 0 :(得分:1)
如果您允许使用外部帮助程序二进制文件,我已将dateutils写入批处理日期和时间数据。
dconv -q -i '(%Y-%m-%d %H:%M:%S)' <<EOF
not a match: 2012-04-10 12:00:00
a match: (2012-04-10 13:00:00)
EOF
将给出
2012-04-10T13:00:00
-i
是输入格式,-q
会抑制警告。 dconv
尝试将输入行转换为输出行(在这种情况下,它将匹配的行转换为ISO标准格式。
因此,如果输入行的数量等于输出行的数量,则文件完全匹配。
答案 1 :(得分:0)
如果您想查看当前日期时间:
echo "(2012-02-11 17:15:00)" | grep "$(date "+%Y-%m-%d %H:%M:%S")"
如果其他一些你需要GNU日期(-d选项)。这对我有用:
echo "(2012-02-11 17:15:00)" |
grep "$(date -d "2012-02-11 17:15:00" "+%Y-%m-%d %H:%M:%S")"
答案 2 :(得分:0)
我会对此采用强制方法:用相应的正则表达式替换任何%X
说明符,然后可以过滤掉与生成的正则表达式不匹配的行:
user_format="%Y-%m-%d"
awk -v fmt_string="$user_format" '
BEGIN {
gsub(/[][(){}?|*+.]/ "\\&", fmt_string) # protect any regex-special chars
gsub(/%Y/, "([0-9]{4})", fmt_string)
gsub(/%m/, "(0[1-9]|1[012])", fmt_string)
gsub(/%d/, "(0[1-9]|[12][0-9]|3[01])", fmt_string)
# and so on
}
$0 !~ "^" fmt_string {print "line " NR " does not match: " $0}
' filename