wyszukaj plik i utwórz nowy plik tylko wtedy, gdy spełniony jest warunek

10

Mam plik dziennika i chcę go wyszukać w poszukiwaniu ciągu i tylko wtedy, gdy ten ciąg zostanie znaleziony, należy utworzyć nowy plik. Jak mogę to osiągnąć, sed doenst wydaje się pasować w tym przypadku.

Jacknife
źródło
3
Użyj grepdo wyszukiwania. -qOpcja będzie tłumić wszystkie wyjścia i powrotu mecz / nonmatch poprzez grep„s kod wyjścia, który jest łatwo sprawdzalne.
waltinator,
2
Pomocne może być poinformowanie nas o tym stanie.
j0h

Odpowiedzi:

16

Wykonaj ocenę zwarcia po grep:

grep -q 'search_pattern' /file && : >/newfile
  • grep -qnie wytwarza danych wyjściowych w STDOUT, po prostu kończy pracę ze statusem wyjścia, 0jeśli wzorzec znajduje się w pliku

  • Jeśli wzorzec zostanie znaleziony ( &&), utwórz plik za /newfilepomocą : >/newfile.


Możesz również wybrać zwykłe touch /newfilepodejście lub bashpuste przekierowanie - też >/newfileby to zrobiło.

Uwaga: jeśli plik już istnieje, touchzmieniłby tylko odpowiednie znaczniki czasu bez obcięcia pliku. Puste przekierowanie >/newfilenie jest obsługiwane we wszystkich powłokach w podróży (np. W zsh), gdzie trzeba ręcznie wysłać EOF.

heemayl
źródło
Czego :zrobić?
George Udosen,
5
@George :jest skrótem true, to polecenie no-op, które zawsze kończy działanie ze statusem wyjścia 0.
heemayl
@ heemayl To działało najlepiej do dziś
Jacknife
6

Dla żartu:

python3 -c "if 'string' in open('logfile').read(): open('newfile', 'wt')"

gdzie 'string'jest zastąpiony przez ciąg (warunek), 'logfile'jest zastąpiony ścieżką do pliku dziennika, 'newfile'jest zastąpiony rzeczywistą ścieżką do pliku, aby utworzyć wszystkie w pojedynczych cudzysłowach, podobnie jak w przykładzie.

Jacob Vlijm
źródło
4

Możesz użyć awk z jego system()poleceniem. Jeśli /pattern/zostanie znaleziony, blok kodu {}zostanie wykonany, w tym przypadku wywołujemy touch /tmp/my_file.txtza pomocą system()polecenia.

Poniższy przykład pokazuje tworzenie pliku tymczasowego, jeśli w nim jest mój użytkownik /etc/passwd.

$ awk '/xieerqi/{system("touch /tmp/my_file.txt")}' /etc/passwd

$ ls -l /tmp/my_file.txt
-rw-rw-r-- 1 xieerqi xieerqi 0 1月  25 07:58 /tmp/my_file.txt

Alternatywnie możemy użyć przekierowania do pliku:

 awk '/xieerqi/{f="/tmp/my_file.txt";print "" > f;close(f)}' /etc/passwd 
Sergiy Kolodyazhnyy
źródło
0

Nie mów, czy chcesz nowy pusty plik, czy potrzebujesz bardziej złożonego przetwarzania, aby utworzyć plik.

Jeśli to pierwsze, odpowiedź @heemayl jest na miejscu.

W przeciwnym razie użyj instrukcji if:

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
Paddy Landau
źródło