使用sed或awk删除到regexp的行

使用sed或awk删除到regexp的行,awk,sed,Awk,Sed,我想使用sed或gawk/awk命令来查找regexp: TRAFFIC 并将其与以下unix命令或类似命令组合,以使sysdate减去一天: date "--date=${dataset_date} -${date_diff} 1 day" +%d%b%Y 然后删除regexp和sysdate之间减去一天的所有行 文件输入示例: TYPE = REGIONAL (keep) TRAFFIC AND LOGISTICS

我想使用sed或gawk/awk命令来查找regexp:

TRAFFIC
并将其与以下unix命令或类似命令组合,以使sysdate减去一天:

date "--date=${dataset_date} -${date_diff} 1 day" +%d%b%Y
然后删除regexp和sysdate之间减去一天的所有行

文件输入示例:

TYPE = REGIONAL                              (keep)
TRAFFIC AND LOGISTICS                        (keep)
                                             (delete)
DATE                                         (delete)
01AUG18                                      (delete)
TIME          TRA            NDFV            (delete)
00:00-00:15    0.00           0              (delete)
00:15-00:30    0.00           0              (delete)
00:30-00:45    0.00           1              (delete)
DATE                                         (delete)
02AUG18                                      (keep - sysdate minus one day)
TIME          TRA            NDFV            (keep)
00:00-00:15    0.00           2              (keep)
00:15-00:30    0.00           0              (keep)
00:30-00:45    0.00           0              (keep)
00:45-01:00    0.00           0              (keep)
文件输出示例:

TYPE = REGIONAL
TRAFFIC AND LOGISTICS
02AUG18    
TIME          TRA            NDFV 
00:00-00:15    0.00           2   
00:15-00:30    0.00           0   
00:30-00:45    0.00           0   
00:45-01:00    0.00           0  
在这种情况下,
02AUG18
将是sysdate减去一天。通常,在regexp和sysdate之间会有更多的行需要删除。是否可以组合以下命令:

sed '/TRAFFIC/,/ [sysdate minus one day] /d'
试试awk:

d=$( date -d yesterday "+%d%b%y" | tr '[:lower:]' '[:upper:]' )
awk -v date="$d" '$1 == date {del = 0}; !del; /TRAFFIC/ {del = 1}'

打印前两行,然后打印从sysdate-1到另一个日期的范围:

sed -n -e '1,2p' -e "/$(date -v-1d  +%d%b%y | tr -s '[:lower:]' '[:upper:]')/,/DATE/p"
输出:

TYPE = REGIONAL                              (keep)
TRAFFIC AND LOGISTICS                        (keep)
20AUG18                                      (keep - sysdate minus one day)
TIME          TRA            NDFV            (keep)
00:00-00:15    0.00           2              (keep)
00:15-00:30    0.00           0              (keep)
00:30-00:45    0.00           0              (keep)
00:45-01:00    0.00           0              (keep)

重点是,是的,您可以将表达式传递给sed;在本例中,作为范围的一部分。注:(1)我假设在第二个日期之后可能还有另一个日期,因此用一个日期关闭了范围,但您可能需要其他日期

看起来
d=
行是用来命名变量的,所以我尝试在awk行上为我的输入和输出文件添加
t1>t2
,但它在通信后删除了所有内容。如果今天是8月3日,这将适用于您的示例文本。但现在不是8月3日,我尝试使用从其他人那里获得的
sed
命令,但我仍然无法使其工作,因此看起来
awk
是本周的赢家。
-v
表示日期?是BSD/OSX吗?@glennjackman是的。根据val调整秒、分钟、小时、月日、周日、月或年。