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.
command-line
Jacknife
la source
la source
grep
pour rechercher. L'-q
option supprimera toutes les sorties et retournera match / nonmatch viagrep
le code de sortie de, qui est facilement testable.Réponses:
Tack une évaluation de court-circuit après
grep
:grep -q
ne produit aucune sortie sur STDOUT, quitte simplement avec le statut de sortie0
si le modèle est trouvé dans le fichierSi le motif est trouvé (
&&
), créez un fichier/newfile
par: >/newfile
.Vous pouvez également opter pour l'
touch /newfile
approche habituelle , ou surbash
, une redirection vide ->/newfile
ferait aussi.Juste pour noter, si le fichier existe déjà,
touch
cela ne changerait que les horodatages pertinents sans tronquer le fichier. Et la redirection vide>/newfile
n'est pas prise en charge sur tous les shells en déplacement (par exemple danszsh
), où vous devez envoyer manuellement l'EOF.la source
:
il?:
est un raccourci pourtrue
, c'est une commande sans opération qui seJuste pour le fun:
où
'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.la source
Vous pouvez utiliser awk avec sa
system()
commande. Si le/pattern/
est trouvé, le bloc de code{}
sera exécuté, dans ce cas nous appelonstouch /tmp/my_file.txt
via lasystem()
commande.L'exemple ci-dessous montre la création d'un fichier temporaire si mon utilisateur est présent dans
/etc/passwd
.Alternativement, nous pourrions utiliser la redirection pour déposer:
la source
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:
la source