提取特定日期的日志文件条目

时间:2017-09-07 09:52:02

标签: shell awk grep

我有以这种格式显示的shell历史记录:

361     2017/08/22 10:50:37 :: df -k .
362     2017/08/22 10:50:41 :: df -gt .
363     2017/08/22 10:50:54 :: while true
        do
        df -gt .
        sleep 5
        done
364     2017/08/22 10:51:15 :: while true
        do
        df -kt .
        sleep 10
        done
365     2017/08/22 11:00:59 :: bffcreate -d /mnt/loopmount2 -t /SOFTWARE/AIX71TL4SP4 all
366     2017/08/22 11:06:31 :: alog -L
367     2017/08/22 11:06:46 :: alog -L boot -o
368     2017/08/22 11:08:01 :: alog -f /var/adm/ras/bootlog -o
369     2017/08/22 11:08:49 :: alog -f /var/adm/ras/bootlog -o > /tmp/1
370     2017/08/22 11:08:58 :: alog -o -t boot > /tmp/2

我想捕获特定于2017/08/22的所有命令并将其保存到文件中。但是如果我使用grep,我就无法捕获那些延伸了几行但在起始行后没有日期列的命令。

Eg. Rows 363 and 364 contains while statements but grep is not able to capture the entire statement.

# history -t -9999 | grep "2017/08/22"
...
360     2017/08/22 10:50:11 :: oslevel -sq
361     2017/08/22 10:50:37 :: df -k .
362     2017/08/22 10:50:41 :: df -gt .
363     2017/08/22 10:50:54 :: while true
364     2017/08/22 10:51:15 :: while true
365     2017/08/22 11:00:59 :: bffcreate -d /mnt/loopmount2 -t /SOFTWARE/AIX71TL4SP4 all
366     2017/08/22 11:06:31 :: alog -L
...

1 个答案:

答案 0 :(得分:2)

awk

$ cat tst.awk
/2017\/08\/22/{ p=1 }
/^[0-9]+/ && $2!~/2017\/08\/22/{ p=0; next }
p

跑步:

$ awk -f tst.awk input.txt
361     2017/08/22 10:50:37 :: df -k .
362     2017/08/22 10:50:41 :: df -gt .
363     2017/08/22 10:50:54 :: while true
        do
        df -gt .
        sleep 5
        done
364     2017/08/22 10:51:15 :: while true
        do
        df -kt .
        sleep 10
        done
365     2017/08/22 11:00:59 :: bffcreate -d /mnt/loopmount2 -t /SOFTWARE/AIX71TL4SP4 all
366     2017/08/22 11:06:31 :: alog -L
367     2017/08/22 11:06:46 :: alog -L boot -o
368     2017/08/22 11:08:01 :: alog -f /var/adm/ras/bootlog -o
369     2017/08/22 11:08:49 :: alog -f /var/adm/ras/bootlog -o > /tmp/1
370     2017/08/22 11:08:58 :: alog -o -t boot > /tmp/2

或命令行:

$ awk '/2017\/08\/22/{ p=1 } /^[0-9]+/ && $2!~/2017\/08\/22/{ p=0; next }p' input.txt

假设您希望将日期用作输入变量,则可以在不使用//标记的情况下再次匹配变量。对命令行稍作更改即可:

$ awk -v d='2017/08/22' '$2~d{p=1} /^[0-9]+/ && $2!~d{p=0; next}p' input.txt