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.
Réponses
Trop de publicités?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 exit0
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.
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.
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
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