web-dev-qa-db-fra.com

passer grep dans une variable en bash

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.

9
newbie.my

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.

12
flesk

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')
9
puckipedia

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
0
gshilin

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 ...

0
Peter Flynn

Utilisez Bash parameter expansion,

var2="${var1#*:}"
0
Prince John Wesley