Avoir le suivant dans une de mes fonctions shell:
function _process () {
awk -v l="$line" '
BEGIN {p=0}
/'"$1"'/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
}
, alors quand appelé comme _process $arg
, $arg
est passé comme $1
et utilisé comme motif de recherche. Cela fonctionne de cette façon, car le shell se développe $1
à la place du motif awk! l
Peut également être utilisé dans le programme awk, en étant déclaré avec -v l="$line"
. Tout va bien.
Est-il possible de la même manière de donner un motif de recherche en tant que variable?
Après ne fonctionnera pas,
awk -v l="$line" -v search="$pattern" '
BEGIN {p=0}
/search/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
, awk ne sera pas interprété /search/
comme une variable, mais littéralement.
if (p) ...
$0 ~ pattern
, et cela ne fonctionne pas, mais avec/'"$1"'/
ça fonctionne!? : O$line
est récupéré, la recherche de modèle est effectuée sur la sortie dewhois $line
,$line
venant du fichier dans un bloc WHILE DO.$line
- faites-le dans votre question pour un formatage approprié.Problème lié au
awk
développement des séquences d’échappement ANSI C (comme\n
pour les sauts de ligne, les sauts\f
de formulaire, les\\
barres obliques inverses, etc.)$1
. Cela devient donc un problème si$1
contient des caractères de barre oblique inverse qui sont communs dans les expressions régulières (avec GNUawk
4.2 ou supérieur, les valeurs commençant par@/
et se terminant par/
sont également un problème ). Une autre approche qui ne souffre pas de ce problème est de l'écrire:La gravité de la situation dépendra de la
awk
mise en œuvre.Tous
awk
fonctionnent de la même manière pour les séquences d’échappement valides:(contenu de
$a
passé tel quel)(
\\
Changé\
et\b
changé à un backspace).la source
\d{3}
à trouver trois chiffres, cela ne fonctionnerait pas comme prévu si je vous comprenais bien?\d
lequel n’est pas une séquence d’échappement C valide, cela dépend de votreawk
implémentation (exécutezawk -v 'a=\d{3}' 'BEGIN{print a}'
pour vérifier). Mais pour\` or
\ b, yes definitely. (BTW, I don't know of any awk implementations that understands
\ d` comme signifiant un chiffre).\d' treated as plain
d '{3}, alors j'imagine que j'aurais un problème dans ce cas?ENVIRON["PATTERN"]
à laPATTERN
variable d'environnement. Si vous souhaitez utiliser une variable shell, vous devez d'abord l'exporter (export variable
) ou utiliser laENV=VALUE awk '...ENVIRON["ENV"]'
syntaxe de transmission env-var comme dans ma réponse.Essayez quelque chose comme:
la source
/regex/
en termes de recherche de modèle, cela pourrait être une bonne solution. Je vais essayer.Non, mais vous pouvez simplement interpoler le motif dans la chaîne entre guillemets que vous passez à awk:
Notez que vous devez maintenant échapper au double awk awk littéral, mais c'est toujours le moyen le plus simple d'accomplir cela.
la source
$pattern
contient des espaces, mon exemple ci-dessus fonctionnera puisque $ 1 est protégé par des guillemets doubles "$ 1", sans toutefois préciser ce qui se passe dans votre cas.'
, protège ensuite les$1
guillemets doubles, puis pointe sur une autre chaîne entre guillemets pour la seconde moitié du programme awk. Si je comprends bien, cela devrait avoir exactement le même effet que protéger les$1
guillemets simples extérieurs - awk ne voit jamais les guillemets que vous mettez autour.$pattern
contient^/ {system("rm -rf /")};
, alors vous êtes en grande difficulté.Vous pouvez utiliser la fonction eval qui résout dans cet exemple la variable nets avant l'exécution de awk.
la source