Odpowiedzi:
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.
:zrobić?
:jest skrótem true, to polecenie no-op, które zawsze kończy działanie ze statusem wyjścia 0.
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.
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
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
grepdo wyszukiwania.-qOpcja będzie tłumić wszystkie wyjścia i powrotu mecz / nonmatch poprzezgrep„s kod wyjścia, który jest łatwo sprawdzalne.