Tener lo siguiente en una de mis funciones de shell:
function _process () {
awk -v l="$line" '
BEGIN {p=0}
/'"$1"'/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
}
, así que cuando se llama como _process $arg
, $arg
se pasa como $1
y se usa como patrón de búsqueda. Funciona de esta manera, ¡porque la carcasa se expande $1
en lugar del patrón awk! También l
se puede usar dentro del programa awk, declarándose con -v l="$line"
. Todo muy bien.
¿Es posible de la misma manera dar un patrón para buscar como variable?
Seguir no funcionará,
awk -v l="$line" -v search="$pattern" '
BEGIN {p=0}
/search/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
, como awk no se interpretará /search/
como una variable, sino literalmente.
if (p) ...
$0 ~ pattern
, y no funciona, ¡¿pero/'"$1"'/
sí funciona ?! : O$line
se recupera, la búsqueda de patrones se realiza en la salida dewhois $line
,$line
proveniente del archivo en un bloque WHILE DO.$line
: hágalo en su pregunta para obtener el formato adecuado.Tiene un problema que
awk
expande las secuencias de escape ANSI C (como\n
para nueva línea,\f
para alimentación de formulario,\\
para barra diagonal inversa, etc.) en$1
. Por lo tanto, se convierte en un problema si$1
contiene caracteres de barra diagonal inversa que es común en las expresiones regulares (con GNUawk
4.2 o superior, los valores que comienzan@/
y terminan en/
, también son un problema ). Otro enfoque que no sufre de ese problema es escribirlo:Lo malo que será dependerá de la
awk
implementación.Sin
awk
embargo, todos funcionan igual para secuencias de escape válidas:(contenido de
$a
aprobado tal cual)(
\\
cambiado\
y\b
cambiado a un carácter de retroceso).fuente
\d{3}
encontrar tres dígitos, eso no funcionaría como se esperaba si te entendiera bien?\d
cual no es una secuencia de escape C válida, eso depende de suawk
implementación (ejecutarawk -v 'a=\d{3}' 'BEGIN{print a}'
para verificar). Pero para\` or
\ b, yes definitely. (BTW, I don't know of any awk implementations that understands
\ d` como significado de un dígito).\d' treated as plain
d 'd {3}, así que supongo que tendría un problema en este caso?ENVIRON["PATTERN"]
con laPATTERN
variable de entorno. Si desea usar una variable de shell, primero debe exportarla (export variable
) o usar laENV=VALUE awk '...ENVIRON["ENV"]'
sintaxis de paso env-var como en mi respuesta.Intenta algo como:
fuente
/regex/
en términos de búsqueda de patrones, esta podría ser una buena solución. Intentaré.No, pero puede simplemente interpolar el patrón en la cadena de comillas dobles que pasa a awk:
Tenga en cuenta que ahora tiene que escapar del literal awk entre comillas dobles, pero sigue siendo la forma más sencilla de lograr esto.
fuente
$pattern
contiene espacios, mi ejemplo de arriba funcionará ya que $ 1 está protegido con comillas dobles "$ 1", sin embargo, no sé qué sucede en su caso.'
, luego protege las$1
comillas dobles y luego agrega otra cadena de comillas simples para la segunda mitad del programa awk. Si lo entiendo correctamente, esto debería tener exactamente el mismo efecto que proteger a$1
través de las comillas simples externas: awk nunca ve las comillas dobles que coloca a su alrededor.$pattern
contiene^/ {system("rm -rf /")};
, entonces estás en un gran problema.Puede usar la función eval que resuelve en este ejemplo la variable nets antes de ejecutar awk.
fuente