Grep wewnątrz wszystkich plików utworzonych w zakresie dat
Jestem na Ubuntu OS. Chcę grep słowo (powiedzmy XYZ) wewnątrz wszystkich plików dziennika, które są tworzone w zakresie dat od 28-may-2012 do 30-may-2012.
Jak to zrobić?
3 answers
Jest to nieco inne rozwiązanie niż rozwiązanie Banthara, ale będzie działać z wersjami find
, które nie obsługują -newermt
i pokazuje, jak używać polecenia xargs
, które jest bardzo użytecznym narzędziem.
Możesz użyć polecenia find
, aby zlokalizować pliki "określonego wieku". Znajdziesz tu wszystkie pliki zmodyfikowane od 5 do 10 dni temu:
find /directory -type f -mtime -10 -mtime +5
Aby następnie wyszukać w tych plikach ciąg znaków:
find /directory -type f -mtime -10 -mtime +5 -print0 |
xargs -0 grep -l expression
Możesz również użyć przełącznika -exec
, ale uważam xargs
za bardziej czytelny (i to często będzie działać lepiej, zbyt, ale prawdopodobnie nie w tym przypadku).
(zauważ, że znacznik -0
pozwala tej komendzie operować na plikach z osadzonymi spacjami, takich jak this is my filename
.)
Aktualizacja dla pytania w komentarzach
Gdy podasz wiele wyrażeń find
, są one połączone razem. Na przykład, jeśli poprosisz o:
find . -name foo -size +10k
...find
zwróci tylko pliki o nazwie (A) foo
i B) większe niż 10 Kb. Podobnie, jeśli podajesz:
find . -mtime -10 -mtime +5
...find
zwróci tylko pliki, które są (a) nowsze niż 10 dni temu i (B) starsze niż 5 dni temu.
Na przykład w moim systemie jest to obecnie:
$ date
Fri Aug 19 12:55:21 EDT 2016
Mam następujące pliki:
$ ls -l
total 0
-rw-rw-r--. 1 lars lars 0 Aug 15 00:00 file1
-rw-rw-r--. 1 lars lars 0 Aug 10 00:00 file2
-rw-rw-r--. 1 lars lars 0 Aug 5 00:00 file3
Jeśli Poproszę o " pliki zmodyfikowane ponad 5 dni temu (-mtime +5
) otrzymuję:
$ find . -mtime +5
./file3
./file2
Ale jeśli Poproszę o "pliki zmodyfikowane więcej niż 5 dni temu, ale mniej niż 10 dni temu" (-mtime +5 -mtime -10
), dostaję:
$ find . -mtime +5 -mtime -10
./file2
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-19 16:58:45
Połącz grep z Znajdź :
find -newermt "28 May 2012" -not -newermt "30 May 2012" -exec grep XYZ \{\} \;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-05 13:45:48
find
wydaje się, że nie ma opcji, w których można określić konkretne daty porównania znaczników czasu (przynajmniej wersja na moim laptopie nie - mogą być inne wersje i/lub inne narzędzia, które działają podobnie), więc będziesz musiał użyć liczby dni. Tak więc, od 2012/06/05, chcesz znaleźć pliki nowsze niż 9 dni, ale starsze niż 6 dni:
find . -type f -ctime -9 -ctime +6 -print0 | xargs -0 grep XYZ
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-05 13:50:13