10 votes

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

J'ai un fichier journal et je veux y rechercher une chaîne de caractères et seulement si cette chaîne est trouvée, un nouveau fichier doit être créé. Comment puis-je réaliser cela, sed ne semble pas convenir dans ce cas.

16voto

heemayl Points 85741

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

grep -q 'search_pattern' /file && : >/newfile
  • grep -q ne produit aucune sortie sur STDOUT, mais sort avec le statut exit 0 si le motif est trouvé dans le fichier

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


Vous pouvez également opter pour la solution habituelle touch /newfile ou sur l'approche bash une redirection vide -- >/newfile le ferait aussi.

Il convient de noter que si le fichier existe déjà, alors touch ne modifierait que les horodatages pertinents sans tronquer le fichier. Et la redirection vide >/newfile n'est pas pris en charge par tous les shells on-the-go (par exemple, dans le cas de zsh ), où vous devez envoyer manuellement le FEO.

6voto

Jacob Vlijm Points 78990

Juste pour le plaisir :

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

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

4voto

Sergiy Kolodyazhnyy Points 97292

Vous pouvez utiliser awk avec son system() commande. Si la commande /pattern/ est trouvé, le bloc de code {} sera exécutée, dans ce cas nous appelons touch /tmp/my_file.txt via 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

Nous pourrions également utiliser la redirection vers un fichier :

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

0voto

Paddy Landau Points 4076

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.

Dans le premier cas, la réponse de @heemayl est tout à fait pertinente.

Dans le cas contraire, il convient d'utiliser une instruction "if" :

if grep -q 'search_pattern' /file
then
    # Create your file here
fi

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X