Tengo dos archivos: master.tbl
ysites.lst
El archivo master.tbl
es una lista de sitios, con sus configuraciones de puertos, nombres de puertos, direcciones IP, etc. Hay líneas que contienen descripciones de sitios, comentarios, etc., pero son irrelevantes. Las líneas que contienen las configuraciones del sitio están ordenadas de la siguiente manera y delimitadas por espacios:
{server} {SITE NAME} {port name} {configuration flags}
Los nombres de los puertos constan del nombre del sitio en minúsculas, un guión, una "P" y el número de puerto.
Ejemplo:
server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments
sites.lst
Hay una lista de sitios en los que necesito buscar el master.tbl
archivo.
Necesito comentar (insertar a #
al principio de la línea) y extraer el nombre del servidor y el nombre del puerto (en un archivo llamado stoplist.lst
) de cada línea que cumpla TODOS los siguientes criterios:
- contiene cualquier nombre de sitio listado en
sites.lst
- contiene "-ADM"
- tiene un número de puerto superior a '2' (ejemplo:
hawaii23-P3
)
En el ejemplo anterior, el master.tbl
archivo se vería así:
server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
#server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments
...y stoplist.lst
contendría (suponiendo HAWAII23
que esté en sites.lst
):
server01 hawaii23-P3
master.lst
Tiene casi 300.000 líneas, por lo que hacer esto manualmente sería... malo.
Respuesta1
Aquí tienes una awk
solución:
awk 'NR==FNR{z[$0"-ADM"]++;next}
{p=$3;sub(/.*-P/, "", p); if ($2 in z && p > 2)
{print $1,$3 > "stoplist.lst"; $0="#"$0}}1' sites.lst master.tbl
Esto se lee sites.lst
primero y se establece $0"-ADM"
(es decir, el nombre del sitio + la cadena -ADM
) como índice de la matriz z
. Luego procesa master.tbl
la extracción del valor posterior -P
en el tercer campo p
y, si se cumplen las condiciones (el segundo campo está dentro z
y p
es mayor que 2), imprime el primer y tercer campo stoplist.lst
y comenta la línea.
Tenga en cuenta que no edita el archivo en el lugar, pero siempre puede redirigir a otro archivo y sobrescribir el original si todo está bien (aunque con uno reciente gnu awk
tiene la opción -i inplace
).