Capture date after regex using awk
我想打印正则表达式 “show memory compare..” 以及来自测试文件的日期。日期可以从一周中的任何一天开始。
问题
-
无法弄清楚如何将星期几传递给 awk。它应该是数组格式吗?
当前方法 (tr) 不替换为 OR (||),它只给出 (|),因此正则表达式替换不起作用。
尝试至今
1
2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash
day_of_week=$(locale day | tr ‘;’ ‘/ awk -v day_of_week="$day_of_week" ‘ ‘ testsnmpoutput.txt |
TESTFILE (testsnmpoutput.txt)
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
xr_lab# show clock
Thu Sep 19 14:38:02.812 WIB 14:38:02.893 WIB Thu Sep 19 2019 xr_lab# xr_lab#show memory compare start Thu Sep 19 14:38:06.400 WIB Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_start.out xr_lab# xr_lab# xr_lab# xr_lab#show memory compare end Thu Sep 19 14:40:56.123 WIB xr_lab#show memory compare start Thu Sep 19 14:46:28.464 WIB Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_start.out xr_lab# xr_lab# xr_lab# xr_lab# xr_lab#show memory compare end show memory compare report show process memory Thu Sep 19 14:50:10.422 WIB |
期望的输出
1
2 3 4 5 6 7 8 |
xr_lab#show memory compare start
Thu Sep 19 14:38:06.400 WIB xr_lab#show memory compare end Thu Sep 19 14:40:56.123 WIB xr_lab#show memory compare start Thu Sep 19 14:46:28.464 WIB xr_lab#show memory compare end Thu Sep 19 14:50:10.422 WIB |
谢谢。
这个oneliner应该做的:
1
|
$ grep -e ‘show memory compare //(start//|end//)’ -e ‘^//(Mon//|Tue//|Wed//|Thu//|Fri//)’ testsnmpoutput.txt | grep -A 1 ‘show memory compare’ | grep -v ‘^–‘
|
试试这个:
1
2 3 4 5 6 7 8 9 |
/show memory compare start|show memory compare end/ {
print; while (getline != 0) { if (match($1,"Mon|Tue|Wed|Thu|Fri|Sat|Sun") != 0) { print; break; } } } |
此代码在包含”显示内存比较开始”或”显示内存比较结束”的行上运行,并从那里开始,遍历行以找出以星期几开始的第一行。
getline 读取输入的下一条记录并更新 $0 和 NF。
请您尝试以下操作。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
awk ‘
BEGIN{ num=split("mon,tue,wed,thu,fri,sat,sun",array,",") for(k=1;k<=num;k++){ days[array[k]] } } /show memory compare start/{ found_start=1 start=$0 next } found_start && tolower($1) in days{ print start ORS $0 found_start=start="" } /show memory compare end/{ found_end=1 end=$0 next } found_end && tolower($1) in days{ print end ORS $0 found_end=end="" } ‘ Input_file |
你可以使用
1
2 3 4 |
day_of_week=$(locale day | sed ‘s///([^;]//{3//}//)[^;]*///1/g’);
day_of_week="${day_of_week//;/|}"; p1=‘show memory compare (start|end)’; awk -v pat1="$p1" -v day_of_week="$day_of_week" ‘($0~pat1),($0~"^("day_of_week")"){ if ($0 ~ pat1 || $0 ~"^("day_of_week")") print $0; }’ file |
查看在线演示。
详情
-
$(locale day | sed ‘s///([^;]//{3//}//)[^;]*///1/g’); – 获取以; 分隔的日期列表,并且只保留每天的 3 个首字母,删除其余的 -
“${day_of_week//;/|}” – 用| 替换所有; -
p1=’show memory compare (start|end)’ 定义包含起始范围模式(show memory compare start 或show memory compare end )的p1 变量 -
‘($0~pat1),($0~”^(“day_of_week”)”) 获取开始和结束模式之间的行范围(请注意,您不能将/…/ 表示法与作为变量传递的正则表达式一起使用) -
{ if ($0 ~ pat1 || $0 ~”^(“day_of_week”)”) print $0; } 仅打印与开始或结束模式匹配的行。
更多
-
//([^;]//{3//}//) – 捕获组 1:-
[^;]//{3//} – 除了; 之外的任何字符出现 3 次
-
-
[^;]* –; 以外的 0 个或更多字符 -
//1 – 匹配被替换为第 1 组的内容 -
g – 所有出现。
请参阅 POSIX ERE 模式版本演示 (
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/270648.html