我有一个带时间戳的文件名列表,格式如下:
cat files
- ..201807010112。日志
- ..201807020112。日志
- ..201807022359。日志
- ..201807030112。日志
- ..201807010412。日志
我需要获得一定的范围,为了做到这一点,我想使用 SED。
sed -n '/201807010112/,/201807030112/p'
这是我的第一次尝试,但 sed 对待小时和分钟的方式很奇怪,长话短说,它无法正确理解这种格式。
我可能会陷入困境,但为了解决这个问题,我决定将格式转换为 SED 可以理解的格式。
cat files | sed -e "s/\([0-9]\{12\}\}/$(date -f '%Y%m%d%H%M' \1)/g"
我的问题是我无法使用比赛结果\1在日期转换块中。
有没有办法做到这一点或更好的方法来获取日期范围?
答案1
您的问题表明您需要获取特定日期范围内的某些日志文件的名称。
让我们忽略文件名位于文本文件中的事实,而是假设您可以直接访问某个目录中的文件$logdir
。
文件名的格式是*_YYYYMMDDhhmmss.log
结尾位是标准时间戳字符串。
*_201807010112.log
要获取循环中和之间的文件*_201807030112.log
(对每个文件执行某些操作),请使用 (in bash
),
process_flag=0
for pathname in "$logdir"/*_??????????????.log
do
if [ "$process_flag" -eq 0 ]; then
if [[ "$pathname" == *_201807010112.log ]]; then
process_flag=1
else
continue
fi
fi
# Do some sort of processing of
# the logfile in "$pathname" here.
# When done...
if [[ "$pathname" == *_201807030112.log ]]; then
break
fi
done
这个循环循环了全部具有类似文件名格式的日志文件。该循环将按字典顺序迭代路径名。假设所有文件都具有相同的文件名前缀(您对此只字未提)。
循环的第一部分检测范围内的第一个文件,并设置process_flag
为1
找到该文件的时间。设置process_flag
为1
使循环能够进入中间位,您实际使用该中间位"$pathname"
来处理您需要执行的文件操作。
在继续下一次迭代之前,最后一条if
语句检查当前是否与$pathname
我们要处理的最后一个文件匹配。如果是,则循环以一条break
语句结束。
答案2
所以我决定不尝试使用日期函数来变换形式,转而使用更多的SED!
猫文件
..._201807010112.log
..._201807010132.log
..._201807010152.log
..._201807010202.log
日期的格式为 YYYYmmddHHSS,我将其转换为以下格式:
YYYY-mm-dd HH:SS 将此正则表达式与 SED 结合使用。
cat files | sed -e 's/\(_[0-9]\{4\}\)\([0-9]\{2\}\) \
\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\) \/\1-\2-\3 \4:\5/g'
接下来,根据日期指定范围就轻而易举了。
| sed -n '/2018-07-01 01:20/,/2018-07-02 02:01/p'
对我来说最大的收获是了解使用 SED 范围模式选项的正确日期时间格式。