Voici mon script (pour trouver les fichiers qui contiennent un modèle spécifié):
find . -type f \
-exec awk -v vawk="$1" '/'"$vawk"'/ {c++} c>0 { print ARGV[1]; exit 0 } END { if (! c) {exit 1}}' \{\} \;
Je voudrais utiliser mon script avec un argument §:
MyScript.sh pattern
Mon problème est que je n'arrive pas à insérer la $1
variable awk
.
Quand j'essaie de déboguer mon script
bash -x MyScript.sh pattern
Voici la sortie:
+ find . -type f -exec awk -v vawk=pattern '// {c++} c>0 {print ARGV[1] ; exit 0 } END { if (! c) {exit 1}}' '{}' ';'
La $vawk
variable semble vide.
Une idée?
awk
développe les séquences d'échappement de type C dans$1
, de sorte que cette approche ne fonctionne pas si elle$1
peut contenir des barres obliques inverses (courantes pour les expressions rationnelles). Vous pouvez utiliser leENVIRON
tableau spécial awk à la place.Reproduit de cela maintenant fermé en double question car il comprend des avertissements sur les limites de passage variable awk que l' on pourrait trouver utile.
Une variable shell n'est que cela: une variable shell . Si vous voulez le transformer en une variable awk , vous avez besoin d'une syntaxe telle que:
ou
Cependant, ceux-ci souffrent d'un problème: les séquences d'échappement y sont développées (et avec GNU
awk
4.2 ou supérieur, si elles$x
commencent@/
et se terminent/
, elles sont traitées comme une variable de type regexp ).Ainsi, par exemple, si la variable shell contient les deux caractères barre oblique inverse et n , la variable awk finira par contenir le caractère de nouvelle ligne (et avec gawk 4.2+, si elle contient
@/foo/
, la variable awk contiendrafoo
et sera de typeregexp
).Une autre approche (mais qui, comme pour,
-v
nécessite un awk ou un nawk POSIX (par opposition à l'awk des années 1970 toujours trouvé comme/bin/awk
dans Solaris)) consiste à utiliser des variables d'environnement:Une autre approche (toujours avec des awks plus récents) consiste à utiliser le tableau ARGV dans awk:
la source