Mam duży plik tekstowy (prawie 3 GB) - jest to plik dziennika. Chcę uzyskać wiersze tekstu odpowiadające zakresowi dat z tego pliku, od 13 lipca do 19 lipca. Mój format dziennika to:
2016-07-12 < ?xml version>
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
2016-07-20 < ?xml version>
sample text sample text
sample text sample text
sample text sample text
2016-07-20 < ?xml version>
sample text sample text
2016-07-20 < ?xml version>
więc po grep
/ sed
powinno być tak wyprowadzone:
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
Jak mogę to zdobyć?
command-line
grep
sed
corey
źródło
źródło
Odpowiedzi:
Ze
grep
jeśli znasz numer linii chcesz, możesz użyć opcji kontekstowe-A
drukować wiersze na wzórdzięki czemu uzyskasz linię z 2013-07-13 i następnymi 3 liniami
z
sed
możesz użyć dat do takiego ograniczeniaktóra wydrukuje wszystkie linie od pierwszej linii z 2016-07-13 do pierwszej linii włącznie z 2016-07-19. Ale to zakłada, że masz tylko jedną linię z 2016-07-19 (nie wydrukuje następnej linii). Jeśli jest wiele wierszy, użyj następnej daty i użyj,
d
aby usunąć z niej wynikźródło
Wystarczy ta prosta wkładka grep one:
Ładnie tu działa i nie ma potrzeby sed :)
Bibliografia:
źródło
^
aby działało. Używam Maca.awk
rozwiązanie:Zasadniczo drukuje każdą linię od tej, która zaczyna się od,
2016-07-13
do tej, która zaczyna się od2016-07-19
źródło
Wszystkie pozostałe aktualne odpowiedzi opierają się na tym, że wpisy w pliku dziennika są sortowane chronologicznie lub na tym, że zakres dat można łatwo dopasować za pomocą wyrażeń regularnych. Jeśli chcesz bardziej ogólnego rozwiązania, musimy zrobić trochę więcej programowania.
Przedstawiam ten skrypt GNU AWK:
Czas rozpoczęcia i zakończenia podajesz za pomocą zmiennych
starttime
orazendtime
w formacie, którymktime
obsługuje (YYYY MM DD hh dd ss
). W ten sposób uruchamiaszawk
polecenie w ten sposób, zakładając, że powyższy skrypt Awk znajduje się w pliku wykonywalnymfilter-log-dates.awk
w bieżącym katalogu roboczym, a plik dziennika tomylog.txt
:Należy pamiętać, że czas zakończenia jest wyłączny , tj. Prawidłowe rekordy dziennika muszą mieć znacznik czasu przed czasem zakończenia.
Jeśli format znacznika czasu jest inny, możesz dostosować wyrażenie regularne przekazane do
match
funkcji, aby go dopasować.źródło
Możesz to zrobić w kilku krokach. Znajdź numer pierwszego wiersza pasującego do wzorca początkowego. Znajdź numer ostatniej linii pasującej do wzorca końcowego. Następnie wyodrębnij test między tymi dwiema liniami. Można to zrobić w następujący sposób.
Można to zrobić wszystko za pomocą
awk
polecenia, ale kroki mogą ułatwić wykonanie. W awk zmienna NR jest bieżącym numerem linii, a ponieważ po wzorcu nie określono żadnej akcji (NR> = 1234 && NR <= 5678), domyślną akcją jest wydrukowanie linii z tego zakresu.źródło