Я работаю с файлом журнала и хочу распечатать с определенного дня до его конца. эта конкретная дата, например, ($ sd = 27 / Dec / 2002). теперь я хочу найти этот день и распечатать его до конца файла журнала! но что, если 27 декабря нет среди записей в файле журнала? он должен искать items> = $ sd (27 / декабрь), как я могу это сделать?
этот код просто ищет $ Sd, который составляет 27 декабря 2002 года, я хочу найти элементы> = $ sd
sed -n "$(awk '/'$sd'/ {print NR}' serverlog.log.log | head -1),$ p" serveerlog.log|cut -d: -f1
решено!
awk -F '[: []' -v vd = $ sd 'BEGIN {gsub (///, "", vd); "date +% s -d \" "vd" \ "" | getline d} { p = $ 0; gsub (///, "", $ 2); "date +% s -d \" "$ 2" \ "" | getline o; if (o> d) print p} 'll.log | cut -d: - $
#!/bin/bash
sd=27/Sep/2011
from=$(date -d "$(echo "$sd" | awk 'BEGIN { FS = "/"; } { print $1" "$2" "$3" 00:00:00" }')" +%s)
while read line
do
date=$(echo $line | awk '{ print substr($4, 2, length($4)-1) }' | awk 'BEGIN { FS = "[/:]"; } { print $1" "$2" "$3" "$4":"$5":"$6 }')
dateepoch=$(date -d "$date" +%s)
if [ $dateepoch -ge $from ]; then
line_number=$(grep -n $(echo $line | awk '{ print substr($4, 2, length($4)-1) }') -m 1 input | cut -d: -f1)
break
fi
done < input
awk 'NR >= '$line_number'' input
В input
файл:
127.0.0.1 - - [18/Sep/2011:21:57:28 +0700] "GET /favicon.ico HTTP/1.1" 404 268
127.0.0.1 - - [19/Sep/2011:22:07:52 +0700] "GET /abcde.png HTTP/1.1" 404 277
127.0.0.1 - - [20/Sep/2011:22:07:54 +0700] "GET /abcde.png HTTP/1.1" 404 277
127.0.0.1 - - [21/Sep/2011:22:11:05 +0700] "GET /index HTTP/1.1" 502 462
127.0.0.1 - - [22/Sep/2011:22:31:22 +0700] "GET / HTTP/1.1" 502 462
127.0.0.1 - - [23/Sep/2011:10:17:34 +0700] "GET / HTTP/1.1" 502 471
127.0.0.1 - - [24/Sep/2011:10:17:36 +0700] "GET /favicon.ico HTTP/1.1" 404 277
127.0.0.1 - - [25/Sep/2011:10:17:36 +0700] "GET /favicon.ico HTTP/1.1" 404 277
127.0.0.1 - - [26/Sep/2011:11:10:33 +0700] "GET / HTTP/1.1" 502 469
127.0.0.1 - - [27/Sep/2011:11:10:34 +0700] "GET /favicon.ico HTTP/1.1" 404 275
127.0.0.1 - - [28/Sep/2011:11:10:34 +0700] "GET /favicon.ico HTTP/1.1" 404 275
Результат:
$ ./date.sh
127.0.0.1 - - [27/Sep/2011:11:10:34 +0700] "GET /favicon.ico HTTP/1.1" 404 275
127.0.0.1 - - [28/Sep/2011:11:10:34 +0700] "GET /favicon.ico HTTP/1.1" 404 275
Если вы измените sd
к 17/Sep/2011
:
$ ./date.sh
127.0.0.1 - - [18/Sep/2011:21:57:28 +0700] "GET /favicon.ico HTTP/1.1" 404 268
127.0.0.1 - - [19/Sep/2011:22:07:52 +0700] "GET /abcde.png HTTP/1.1" 404 277
127.0.0.1 - - [20/Sep/2011:22:07:54 +0700] "GET /abcde.png HTTP/1.1" 404 277
127.0.0.1 - - [21/Sep/2011:22:11:05 +0700] "GET /index HTTP/1.1" 502 462
127.0.0.1 - - [22/Sep/2011:22:31:22 +0700] "GET / HTTP/1.1" 502 462
127.0.0.1 - - [23/Sep/2011:10:17:34 +0700] "GET / HTTP/1.1" 502 471
127.0.0.1 - - [24/Sep/2011:10:17:36 +0700] "GET /favicon.ico HTTP/1.1" 404 277
127.0.0.1 - - [25/Sep/2011:10:17:36 +0700] "GET /favicon.ico HTTP/1.1" 404 277
127.0.0.1 - - [26/Sep/2011:11:10:33 +0700] "GET / HTTP/1.1" 502 469
127.0.0.1 - - [27/Sep/2011:11:10:34 +0700] "GET /favicon.ico HTTP/1.1" 404 275
127.0.0.1 - - [28/Sep/2011:11:10:34 +0700] "GET /favicon.ico HTTP/1.1" 404 275
Если вам нужно распечатать строки после первого появления даты, попробуйте следующее:
tail --lines=\+`cat your_file | grep -n "27/Dec/2002" | awk -F : '{ print $1 }'` your_file