rechercher un fichier et créer un nouveau fichier uniquement si une condition est remplie

10

J'ai un fichier journal et je veux le rechercher pour une chaîne et seulement si cette chaîne est trouvée un nouveau fichier à créer. Comment puis-je y parvenir, sed ne semble pas convenir dans ce cas.

Jacknife
la source
3
Utilisez greppour rechercher. L' -qoption supprimera toutes les sorties et retournera match / nonmatch via greple code de sortie de, qui est facilement testable.
waltinator le
2
Il pourrait être utile de nous dire quelle est la condition.
j0h

Réponses:

16

Tack une évaluation de court-circuit après grep:

grep -q 'search_pattern' /file && : >/newfile
  • grep -qne produit aucune sortie sur STDOUT, quitte simplement avec le statut de sortie 0si le modèle est trouvé dans le fichier

  • Si le motif est trouvé ( &&), créez un fichier /newfilepar : >/newfile.


Vous pouvez également opter pour l' touch /newfileapproche habituelle , ou sur bash, une redirection vide - >/newfileferait aussi.

Juste pour noter, si le fichier existe déjà, touchcela ne changerait que les horodatages pertinents sans tronquer le fichier. Et la redirection vide >/newfilen'est pas prise en charge sur tous les shells en déplacement (par exemple dans zsh), où vous devez envoyer manuellement l'EOF.

heemayl
la source
Que fait- :il?
George Udosen
5
@George :est un raccourci pour true, c'est une commande sans opération qui se
termine
@heemayl Cela a fonctionné jusqu'à ce jour
Jacknife
6

Juste pour le fun:

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

'string'est remplacé par la chaîne (condition), 'logfile'est remplacé par le chemin d'accès au fichier journal, 'newfile'est remplacé par le chemin d'accès réel au fichier à créer, le tout entre guillemets simples, comme dans l'exemple.

Jacob Vlijm
la source
4

Vous pouvez utiliser awk avec sa system()commande. Si le /pattern/est trouvé, le bloc de code {}sera exécuté, dans ce cas nous appelons touch /tmp/my_file.txtvia la system()commande.

L'exemple ci-dessous montre la création d'un fichier temporaire si mon utilisateur est présent dans /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

Alternativement, nous pourrions utiliser la redirection pour déposer:

 awk '/xieerqi/{f="/tmp/my_file.txt";print "" > f;close(f)}' /etc/passwd 
Sergiy Kolodyazhnyy
la source
0

Vous ne dites pas si vous voulez un nouveau fichier vide ou si vous avez besoin d'un traitement plus complexe pour créer le fichier.

S'il s'agit du premier, la réponse de @heemayl est parfaite.

Sinon, utilisez une instruction if:

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
Paddy Landau
la source