我有以这种格式显示的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
...
答案 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