texto por extension ejemplos directorio con comandos buscar basicos archivos linux bash awk ibm-mq aix

por - en linux



Script UNIX(AIX) para procesar un archivo utilizando awk u otras utilidades de procesamiento de archivos (6)

Aquí hay uno que no usa gsub :

awk -F "[()]" ''/QUEUE/ {quename=$2} /CURDEPTH/(/ {print quename, $2} ''

Tengo una tarea para escribir un script que filtrará una entrada de un comando runmqsc de MQ y redirigirá el resultado a otro archivo. He estado trabajando con muchos otros comandos de Linux conectados y parece funcionar muy bien en Linux, pero mi administrador necesita ejecutar el script en un sistema AIX, por lo que el sistema operativo UNIX. Me di cuenta de que muchos comandos que funcionan bien en Linux o hacen el trabajo en Linux producirán un resultado totalmente diferente en sistemas basados ​​en UNIX o UNIX. El resultado del comando runmqsc tiene el siguiente aspecto:

5724-H72 (C) Copyright IBM Corp. 1994, 2009. ALL RIGHTS RESERVED. Starting MQSC for queue manager CNUMQ02B. 1 : DISPLAY QLOCAL(*) CURDEPTH AMQ8409: Display Queue details. QUEUE(ADEXA.AOM.REPLY.MR.QL) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: Display Queue details. QUEUE(ADEXA.AOM.REPLY.QL) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: Display Queue details. QUEUE(ADEXA.ERROR.QL) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: Display Queue details. QUEUE(ADEXA.FACT.OUT.QL) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: Display Queue details. QUEUE(ADW.REMAN.XREF.ERR.QL) TYPE(QLOCAL) CURDEPTH(14) AMQ8409: Display Queue details. QUEUE(SAPNA.MESS.CRITICAL.CLASS.RESUME.QL) TYPE(QLOCAL) CURDEPTH(123) One MQSC command read. No commands have a syntax error. All valid MQSC commands were processed.

Lo que básicamente necesito hacer es mostrar solo el nombre de la cola, un espacio en blanco y luego la profundidad de cola en la misma línea, sin espacios en blanco al final ni caracteres de nueva línea al principio o al final del archivo, para que se parezca a un Archivo csv con espacios en blanco como separador. También necesito filtrar las colas que tienen una profundidad de cola igual a 0, por lo que la salida se verá así:

ADW.REMAN.XREF.ERR.QL 14

Como dije, probé muchos comandos en Linux, pero tengo una falta de conocimiento de qué comandos y banderas realmente funcionan más o menos igual en UNIX y Linux, y mi gerente lo quiere hoy, así que si por casualidad lo leen, le pido que al menos me guíe sobre qué usar para tratar de resolverlo :) Gracias.

Esto es lo que escribí en Linux:

head -n -3 "$1" | tail -n +6 | sed ''/AMQ8409: Display Queue details./d'' | sed ''s/TYPE(QLOCAL)//g'' | tr -d '' /t/r/f'' | awk ''NR%2{printf "%s ",$0;next;}1'' | sed ''/CURDEPTH(0)/d'' | awk ''{gsub(/QUEUE(/, ""); gsub(/CURDEPTH(/, ""); gsub(/)/, ""); print}'' | sort -nk2


Con awk , eso se puede hacer con relativa facilidad:

runmqsc "display qlocal(*) curdepth" | awk '' /QUEUE/(/ { gsub(/^[^/(]*/(/, "", $0); gsub(//).*$/, "", $0); qname = $0; } /CURDEPTH/(/ { gsub(/^[^/(]*/(/, "", $0); gsub(//).*$/, "", $0); print qname" "$0; }''

Esto básicamente solo extrae el nombre de la cola de las líneas que contienen QUEUE( y las almacena para más adelante).

Cuando encuentra líneas que contienen CURDEPTH( , extrae la profundidad de la misma manera y luego la genera junto con el nombre de la cola almacenada.

Las dos llamadas gsub en cada sección se ven como "magia negra", pero son fáciles de entender una vez que sabes lo que significan. El primero encuentra un patrón en el inicio de línea que consiste en la mayor cantidad de no- ( caracteres seguidos de a ( personaje, luego lo reemplaza con nada).

El segundo es similar pero elimina la secuencia más grande de " ) seguida de cualquier carácter hasta el final de la línea".


En lugar de usar "cabeza" y "cola" y "sed" para eliminar las líneas no deseadas, use grep para tomar las que desee. No estoy seguro de cuál de estas opciones funcionará en AIX, pero todas deberían creer.

grep -B 1 CURDEPTH $1 grep -A 1 QUEUE $1 grep -e QUEUE -e CURDEPTH $1

Luego, únete y formatea las líneas:

sed ''s#.*QUEUE(/([^)]*/)).*/n.*CURDEPTH(/([0-9]*/)).*#/1 /2#''

Si eso no funciona correctamente, intente usar ''/ r'' en lugar de ''/ n''.

Por último, elimine todas las líneas con una profundidad de 0 (2 opciones):

grep -v " 0$" sed ''# 0$#d''

No estoy muy familiarizado con esta forma de sed, la pellizqué con el ejemplo del código, pero parece simple, así que debería funcionar.

Todos estos comandos son acerca de la forma más básica que puede obtener, por lo que deberían funcionar igual de bien en cualquier sistema * nix. Ojalá. El grep inicial y el sed son los puntos más altos de riesgo.


Esto funciona para mí en AIX para obtener la salida que necesita, esto usa la cláusula WHERE IBM MQ para restringir el resultado a las colas con un CURDEPTH mayor que 0:

echo "DIS QL(*) WHERE(CURDEPTH GT 0)" | runmqsc <qmgr> | sed -e ''s//((.*)/) */(.*/)//1/ /2/g'' -e ''s/^ */([A-Z][A-Z]*[(][^)][^)]*[)]/)//1/g'' -e ''s/^/(AMQ[0-9][0-9]*:/).*$//1/g'' | awk -F ''[()]'' -v OFS=" " ''function printValues() { if ("QUEUE" in p) { print p["QUEUE"], p["CURDEPTH"] } } /AMQ8409:/ { printValues(); for (i in p) { delete p[i] }; next } { p[$1] = $2 } END { printValues() }''

Tenga en cuenta que arriba hay dos líneas, el / al final de la primera línea permite que el comando sed reemplace con una nueva línea incorporada. La sintaxis awk printValues ​​es de @ mike.dld respuesta a esta publicación " Imprimir parte de una matriz o un archivo y ordenar en shell ". Tuve que reemplazar su delete p con for (i in p) { delete p[i] } ya que AIX awk no soportaba la otra sintaxis.

Si desea ejecutar con un archivo como entrada, use lo siguiente:

cat file | sed -e ''s//((.*)/) */(.*/)//1/ /2/g'' -e ''s/^ */([A-Z][A-Z]*[(][^)][^)]*[)]/)//1/g'' -e ''s/^/(AMQ[0-9][0-9]*:/).*$//1/g'' | awk -F ''[()]'' -v OFS=" " ''function printValues() { if ("QUEUE" in p) { print p["QUEUE"], p["CURDEPTH"] } } /AMQ8409:/ { printValues(); for (i in p) { delete p[i] }; next } { p[$1] = $2 } END { printValues() }'' | grep -v '' 0$''

Es fácil agregar cualquier cantidad de atributos a la salida. Si desea expandirlo en el futuro, simplemente agregue más entradas al comando awk para cada atributo requerido de esta manera:, , p["ATTR1"], p["ATTR2"]

Usando MAXDEPTH como ejemplo:

echo "DIS QL(*) WHERE(CURDEPTH GT 0)" | runmqsc <qmgr> | sed -e ''s//((.*)/) */(.*/)//1/ /2/g'' -e ''s/^ */([A-Z][A-Z]*[(][^)][^)]*[)]/)//1/g'' -e ''s/^/(AMQ[0-9][0-9]*:/).*$//1/g'' | awk -F ''[()]'' -v OFS=" " ''function printValues() { if ("QUEUE" in p) { print p["QUEUE"], p["CURDEPTH"], p["MAXDEPTH"] } } /AMQ8409:/ { printValues(); for (i in p) { delete p[i] }; next } { p[$1] = $2 } END { printValues() }''

Tenga en cuenta que esta respuesta y probablemente otras tendrán un problema si el atributo en sí tiene paréntesis incrustados, esto es posible en el campo DESCR de la cola y es verdadero para otros campos en otros tipos de objetos. Un ejemplo común es el atributo CONNAME de un CHANNEL . El CONNAME utiliza el formato hostname(port) por lo que se muestra como CONNAME(hostname(port)) .


Prueba este comando más simple ..

sed -n -e ''s/.*QUEUE(/([^)]*/)).*//1/p'' -e ''s/.*CURDEPTH(/([0-9]*/)).*//1/p'' / | paste -d '' '' - - / | grep -v '' 0$''


$ awk ''/QUEUE|CURDEPTH/(/ { # on matching records gsub(/^[^(]+/(|).*$/,""); # remove unwanted parts printf "%s%s", $0, ($0~/^[0-9]+$/?ORS:OFS) # print ORS after depth }'' file ADEXA.AOM.REPLY.MR.QL 0 ADEXA.AOM.REPLY.QL 0 ADEXA.ERROR.QL 0 ADEXA.FACT.OUT.QL 0 ADW.REMAN.XREF.ERR.QL 14