Grep 排序日期

Grep sorting dates

每天我都必须通过查找日期早于当天的呼叫来手动识别每个卡住的呼叫。我已经设法 grep 所需的字段以识别有问题的调用。

grep -e start -e instance stuckcdr.txt


CDR instance 153 [] > :
                start                    [12:04:2022][10:07:09:968]
CDR instance 200 [] > :
                start                    [12:04:2022][10:05:56:991]
CDR instance 209 [] > :
                start                    [12:04:2022][09:55:55:358]
CDR instance 216 [] > :
                start                    [12:04:2022][10:05:40:443]
CDR instance 218 [] > :
                start                    [12:04:2022][10:07:44:084]
CDR instance 221 [] > :
                start                    [12:04:2022][10:08:11:690]
CDR instance 222 [] > :
                start                    [12:04:2022][09:52:47:846]
CDR instance 223 [] > :
                start                    [07:04:2022][12:28:03:858]
CDR instance 225 [] > :
                start                    [12:04:2022][10:02:40:345]
CDR instance 226 [] > :
                start                    [12:04:2022][10:07:58:530]
CDR instance 227 [] > :
                start                    [03:04:2022][17:53:16:771]
CDR instance 231 [] > :
                start                    [12:04:2022][10:06:19:830]
CDR instance 234 [] > :
                start                    [12:04:2022][10:06:06:937]
CDR instance 237 [] > :
                start                    [04:04:2022][08:55:03:575]
CDR instance 238 [] > :
                start                    [07:04:2022][12:28:15:537]
CDR instance 242 [] > :
                start                    [12:04:2022][10:05:18:753]
CDR instance 243 [] > :
                start                    [07:04:2022][12:23:38:303]
CDR instance 244 [] > :
                start                    [12:04:2022][10:01:40:195]
CDR instance 245 [] > :
                start                    [12:04:2022][10:08:33:821]
CDR instance 246 [] > :
                start                    [12:04:2022][09:53:03:281]
CDR instance 247 [] > :
                start                    [12:04:2022][09:42:06:561]
CDR instance 248 [] > :
                start                    [12:04:2022][10:04:49:953]
CDR instance 249 [] > :
                start                    [12:04:2022][10:07:29:250]
CDR instance 250 [] > :
                start                    [12:04:2022][10:01:33:905]
CDR instance 253 [] > :
                start                    [12:04:2022][09:55:48:996]
CDR instance 254 [] > :
                start                    [07:04:2022][12:27:55:402]
CDR instance 255 [] > :
                start                    [12:04:2022][10:04:38:088]
CDR instance 256 [] > :
                start                    [12:04:2022][09:42:47:932]
CDR instance 258 [] > :
                start                    [12:04:2022][09:57:16:372]
CDR instance 259 [] > :
                start                    [12:04:2022][09:46:35:323]
CDR instance 260 [] > :
                start                    [12:04:2022][10:05:19:144]
CDR instance 262 [] > :
                start                    [12:04:2022][09:52:56:531]
CDR instance 263 [] > :
                start                    [12:04:2022][10:07:50:331]

我还可以按早于当前日期的开始日期过滤数据吗?

它会大大加快这个过程:)

谢谢

请您尝试组合使用 GNU sedsort 和其他命令:

#!/bin/bash

today=$(date +%F)
sed -E '/^CDR/N;s/\n//' input_file.txt | sed -E 's/(^[^][]+\[][^][]+\[([0-9]{2}):([0-9]{2}):([0-9]{4}).*)/--\t/' | sort -k1,1 | sed "/^$today/{d;q}" | cut -f2- | sed 's/> :/\n/'

结果:

CDR instance 227 [] 
                start                    [03:04:2022][17:53:16:771]
CDR instance 237 [] 
                start                    [04:04:2022][08:55:03:575]
CDR instance 223 [] 
                start                    [07:04:2022][12:28:03:858]
CDR instance 238 [] 
                start                    [07:04:2022][12:28:15:537]
CDR instance 243 [] 
                start                    [07:04:2022][12:23:38:303]
CDR instance 254 [] 
                start                    [07:04:2022][12:27:55:402]
  • 首先将today赋给今天的字符串,格式为YYYY-MM-DD.
  • sed -E '/^CDR/N;s/\n//' 合并两行以方便排序。
  • sed -E 's/(^[^][]+\[][^][]+\[([0-9]{2}):([0-9]{2}):([0-9]{4}).*)/--\t/' 提取日期字段,然后将日期字符串添加到该行 将格式重新排列为 YYYY-MM-DD.
  • sort -k1,1 按日期对行进行排序,旧的在前,新的在后。
  • sed "/^$today/{d;q}" 打印比今天早的行,独占。
  • cut -f2- 删除该行前面的日期字段。
  • sed 's/> :/\n/' 将行拆分为原来的两行。

您可以通过要求 grep 排除与今天日期匹配的行来更接近;这假设您没有 future 时间戳的任何记录!

grep -e start -e instance stuckcdr.txt | grep -v "$(date +'%d:%m:%Y')"

这将留下“实例”行(对应于今天),但从视觉上更容易找到历史日期和数据。

使用 awk:

编辑:这仅在日期单位从大到小排序时有效(例如%Y:%m:%d)。 OP 的数据并非如此。请参阅下面的评论和修改后的解决方案。

LC_ALL=C awk -v date="$(date '+[%d:%m:%Y][00:00:00:000]')" '
=="instance"{instance=[=10=]}
=="start" && <date {=; print instance,[=10=]}' stuckcdr.txt

这会打印当天开始之前的条目。

我们使用词法排序来比较日期字符串。这是可能的,因为每个字段(月、小时等)的长度相同。 LC_ALL=C 保证在不同语言环境中的行为一致。

要打印早于 'now' 的条目(当脚本为 运行 时,精确到秒,而不是早于 'today'),请使用此日期语法:date="$(date '+[%d:%m:%Y][%H:%M:%S:000]')".

= 只是修剪空白。为了便于阅读,我还在同一行打印了实例编号和日期。

示例输出:

CDR instance 223 [] > : start [07:04:2022][12:28:03:858]
CDR instance 227 [] > : start [03:04:2022][17:53:16:771]
CDR instance 237 [] > : start [04:04:2022][08:55:03:575]
CDR instance 238 [] > : start [07:04:2022][12:28:15:537]
CDR instance 243 [] > : start [07:04:2022][12:23:38:303]
CDR instance 254 [] > : start [07:04:2022][12:27:55:402]

您还可以通过管道将输出排序到 sort -k 8,8(按日期排序)或 sort -n 3,3(按实例编号排序)。

编辑:

正如 tshiono 在评论中指出的那样,日期格式错误,无法直接比较。此修改后的解决方案拆分并重新排列日期以进行正确比较。

LC_ALL=C awk -v date="$(date '+[%Y:%m:%d][00:00:00:000]')" '
=="instance"{instance=[=12=]}
=="start" && split(, a, /[]:[]+/) &&
date>"["a[4]":"a[3]":"a[2]"]["a[5]":"a[6]":"a[7]"]" {
    =
    print instance,[=12=]
}
' stuckcdr.txt
  1. paste将每2行合并为1行。
  2. awk过滤行。
  3. 将每 1 行分成 2 行 tr

此技术也称为 Schwartzian 变换

λ cat input.txt
CDR instance 153 [] > :
                start                    [12:04:2022][10:07:09:968]
CDR instance 200 [] > :
                start                    [12:04:2022][10:05:56:991]
CDR instance 209 [] > :
                start                    [12:04:2022][09:55:55:358]
CDR instance 216 [] > :
                start                    [12:04:2022][10:05:40:443]
CDR instance 218 [] > :
                start                    [12:04:2022][10:07:44:084]
CDR instance 221 [] > :
                start                    [12:04:2022][10:08:11:690]
CDR instance 222 [] > :
                start                    [12:04:2022][09:52:47:846]
CDR instance 223 [] > :
                start                    [07:04:2022][12:28:03:858]
CDR instance 225 [] > :
                start                    [12:04:2022][10:02:40:345]
CDR instance 226 [] > :
                start                    [12:04:2022][10:07:58:530]
CDR instance 227 [] > :
                start                    [03:04:2022][17:53:16:771]
CDR instance 231 [] > :
                start                    [12:04:2022][10:06:19:830]
CDR instance 234 [] > :
                start                    [12:04:2022][10:06:06:937]
CDR instance 237 [] > :
                start                    [04:04:2022][08:55:03:575]
CDR instance 238 [] > :
                start                    [07:04:2022][12:28:15:537]
CDR instance 242 [] > :
                start                    [12:04:2022][10:05:18:753]
CDR instance 243 [] > :
                start                    [07:04:2022][12:23:38:303]
CDR instance 244 [] > :
                start                    [12:04:2022][10:01:40:195]
CDR instance 245 [] > :
                start                    [12:04:2022][10:08:33:821]
CDR instance 246 [] > :
                start                    [12:04:2022][09:53:03:281]
CDR instance 247 [] > :
                start                    [12:04:2022][09:42:06:561]
CDR instance 248 [] > :
                start                    [12:04:2022][10:04:49:953]
CDR instance 249 [] > :
                start                    [12:04:2022][10:07:29:250]
CDR instance 250 [] > :
                start                    [12:04:2022][10:01:33:905]
CDR instance 253 [] > :
                start                    [12:04:2022][09:55:48:996]
CDR instance 254 [] > :
                start                    [07:04:2022][12:27:55:402]
CDR instance 255 [] > :
                start                    [12:04:2022][10:04:38:088]
CDR instance 256 [] > :
                start                    [12:04:2022][09:42:47:932]
CDR instance 258 [] > :
                start                    [12:04:2022][09:57:16:372]
CDR instance 259 [] > :
                start                    [12:04:2022][09:46:35:323]
CDR instance 260 [] > :
                start                    [12:04:2022][10:05:19:144]
CDR instance 262 [] > :
                start                    [12:04:2022][09:52:56:531]
CDR instance 263 [] > :
                start                    [12:04:2022][10:07:50:331]
paste -sd '\t\n' input.txt |
  awk -v today=20220408 -F : '{ len=length([=11=]); split(substr([=11=], len-24, 10),a,":") } today > a[3] a[2] a[1]' |
  tr '\t' '\n'
CDR instance 223 [] > :
                start                    [07:04:2022][12:28:03:858]
CDR instance 227 [] > :
                start                    [03:04:2022][17:53:16:771]
CDR instance 237 [] > :
                start                    [04:04:2022][08:55:03:575]
CDR instance 238 [] > :
                start                    [07:04:2022][12:28:15:537]
CDR instance 243 [] > :
                start                    [07:04:2022][12:23:38:303]
CDR instance 254 [] > :
                start                    [07:04:2022][12:27:55:402]

要按早于当前日期的开始日期过滤数据,请使用 awk -v today=$(date +%Y%m%d) 获取系统时间。