在替换部分方法中使用 Sed Regex 捕获组

在替换部分方法中使用 Sed Regex 捕获组

我有一个带时间戳的文件名列表,格式如下:

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_flag1找到该文件的时间。设置process_flag1使循环能够进入中间位,您实际使用该中间位"$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 范围模式选项的正确日期时间格式。

相关内容