J'ai un fichier nommé email.txt comme celui-ci:
Subject:My test
From:my email <[email protected]>
this is third test
Je veux supprimer uniquement l'adresse e-mail de ce fichier à l'aide de script bash.Alors j'ai mis ce script dans mon script bash nommé myscript:
#!/bin/bash
file=$(myscript)
var1=$(awk 'NR==2' $file)
var2=$("$var1" | (grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'))
echo $var2
Mais j’ai échoué à exécuter ce script. Quand j’exécute cette commande manuellement sous bash, je peux obtenir l’adresse électronique suivante:
echo $var1 | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'
Je dois mettre l'adresse e-mail à stocker dans une variable afin que je puisse l'utiliser dans une autre fonction.Peut-on me montrer comment résoudre ce problème? Merci.
Je pense que c’est une façon trop compliquée d’agir, mais si vous voulez seulement que votre script fonctionne, essayez ceci:
#!/bin/bash
file="email.txt"
var1=$(awk 'NR==2' $file)
var2=$(echo "$var1" | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b')
echo $var2
Je ne sais pas ce que file=$(myscript)
était censé faire, mais à la ligne suivante, vous voulez un nom de fichier comme argument pour awk
. Vous devez donc simplement affecter email.txt
à file
comme chaîne, sans exécuter une commande appelée myscript
. $var1
n'est pas une commande (c'est juste une ligne de votre fichier texte), vous devez donc echo
pour donner à grep
tout élément utile à utiliser. Les parenthèses supplémentaires autour de grep
sont redondantes.
Qu'est-ce qui se passe est la suivante:
var2=$("$var1" | (grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'))
^^^^^^^ Execute the program named (what is in variable var1).
Vous devez faire quelque chose comme ça:
var2=$(echo "$var1" | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b')
ou même
var2=$(awk 'NR==2' $file | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b')
Il y a des drapeaux très utiles pour bash: -xv
La ligne avec
var2=$("$var1" | (grep...
devrait être
var2=$(echo "$var1" | (grep...
De plus, ma version de grep n'a pas le drapeau -o.
Et, dans la mesure où les modèles grep sont "gourmands" même si le code suivant est exécuté, sa sortie n'est pas exactement ce que vous voulez.
#!/bin/bash -xv
file=test.txt
var1=$(awk 'NR==2' $file)
var2=$(echo "$var1" | (grep -Ei '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}\b'))
echo $var2
Il y a une manière plus cruelle:
cat $ file | grep @ | tr '<>' '\ 012\012' | grep @
Autrement dit, extrayez la ligne [s] avec les signes @, transformez les chevrons en nouvelles lignes, puis à nouveau grep pour tout ce qui reste avec un signe @.
Affiner au besoin ...
Utilisez Bash parameter expansion
,
var2="${var1#*:}"