Script BASH: lectura de resultados y corte por valor

Script BASH: lectura de resultados y corte por valor

Estoy intentando crear un script BASH que ejecutará un comando, filtrará el resultado de ese comando y luego leerá los resultados de ese resultado para luego imprimir solo las secciones que cumplan con el requisito dado.

Por ejemplo:

Logré reducir la salida del comando original para que la salida se vea así:

Profile: 1
PsA of Profile 1: 13
PsL of Profile 1: 15
Profile: 2
PsA of Profile 2: 0
PsL of Profile 2: 0

Estoy intentando escribir un script BASH que lea cada sección de perfil individualmente y solo imprima los números de perfil que tengan valores PsA y PsL superiores a 0.

Para mayor claridad, la salida debe ser solo el valor del perfil, por lo que en este ejemplo: 1, con 2 descartados.

También es necesario que sea un script BASH debido al trabajo que estoy intentando realizar.

Soy realmente nuevo en todo esto y estoy completamente estancado. ¡Por favor ayuda!

** EDITAR ** Para mayor claridad, estoy intentando trabajar con el Marco de Volatilidad. Estoy mirando los perfiles que se pueden obtener y, actualmente, el resultado exacto se ve así:

Profile suggestion (KDBGHeader): WinXPSP3x86
PsActiveProcessHead           : 0x8055a158 (31 processes)
PsLoadedModuleList            : 0x80553fc0 (122 modules)
Profile suggestion (KDBGHeader): WinXPSP2x86
PsActiveProcessHead           : 0x8055a158 (31 processes)
PsLoadedModuleList            : 0x80553fc0 (122 modules)

Lo que necesito es que el script verifique PsActiveProcessHead y PsLoadedModuleList (PsA y PsL), específicamente, la cantidad de procesos y módulos encontrados, si AMBOS, que se muestran entre paréntesis, están por encima de 0, entonces imprima la sugerencia de perfil. Puede haber 1 sugerencia de perfil, puede haber más. Necesito que el script genere cualquier perfil encontrado que tenga módulos y procesos enumerados arriba de 0.

Mis disculpas por la pregunta original poco clara. Intenté simplificarla y adaptar las respuestas, pero todavía tengo dificultades. ¡Lo siento!

(Para ser muy claro, lo anterior es sólo un ejemplo del formato de salida, no siempre ambos tendrán números superiores a 0 y puede haber más de 2 sugerencias de perfil)

Respuesta1

Puedes usar sedcon un N;Desquema:

sed -n 'N;s/PsA\( of Profile \([0-9]*\): \)[^0].*\nPsL\1[^0].*/\2/p;D'

Agrega Nla siguiente línea, por lo que siempre tendrás dos en el espacio del patrón. Luego simplemente define un patrón con ambos valores del mismo perfil y un número que no comienza con cero (¡por lo que los valores con ceros a la izquierda fallarán!). Si hay una coincidencia, reemplace el patrón por el número de perfil al que se hace referencia e pimprímalo (mientras la salida predeterminada está deshabilitada por -nopción). Luego comience de nuevo con D, reduciendo la línea anterior si hay dos.

Actualizar según la actualización de la pregunta.

Para el escenario del mundo real que diste, sugiero un enfoque diferente:

sed -n '/Profile suggestion/!d;h;n;/(0/d;n;//d;g;p' yourfile

Explicación:

  • /Profile suggestion/!dsignifica: elimine todas las líneas que no sean sugerencias de perfil. Detenga el script aquí para continuar con la siguiente línea.
  • hcopia la sugerencia de perfil al espacio de espera, para que podamos imprimirla si es necesario
  • ncontinúa con la siguiente línea. El actual no se imprime por la -nopción al sedcomando
  • /(0/delimina este ciclo si encontramos el patrón (0, porque esto significa que no hay procesos
  • n;//dexactamente como arriba, para asegurarse de que la segunda línea también tenga procesos
  • En este punto del script sabemos que teníamos una sugerencia privilegiada con dos líneas siguientes, cada una con un número de procesos distinto de cero. gcopia el espacio retenido nuevamente para que sea espacio de patrón, para que podamos pimprimir la sugerencia

Respuesta2

awk -F": " '
    $0~/^PsA/ && $2 > 0 
    {
        getline; 
        if($2 <= 0) next; 
        sub(/[^0-9]*/, "", $1); 
        print $1
     }' data

Suponiendo que PsAvenga primero PsLcuando encontremos esto, tome la siguiente línea de texto ( getline) y verifique si el valor es mayor que 0.

Si esto tiene éxito, aproveche el hecho de que el registro PsAy PsLcontiene, en sí mismo, el nombre del perfil. Toma esto de la línea e imprímelo.


Según su edición:

awk -F": " '
    $0~/^Profile/ && h=$0 {next} 
    $1~/^PsA/ && $2~/\([^0]/ {
        getline; 
        if ($2~/\([^0]/) print h
    }' data

Si la línea actual comienza con Profile, guarde el encabezado completo y pase a la siguiente línea.

Si el primer campo comienza con PsAy dentro de los corchetes no es 0, obtenga la siguiente línea y haga la misma verificación; si tiene éxito, imprima el encabezado.

Respuesta3

Usando awk:

NOTA: input.txtes un archivo de texto que contiene su entrada de muestra, para realizar pruebas. En su lugar, puede canalizar la salida de su comando directamente a este script awk.

$ awk -F' +|\\(' '/^Profile/ {p=$0};
                  /^PsA/ {a=$5};
                  /^PsL/ {l=$5};
                  a > 0 && l > 0 && p {print p; p=""; a=0; l=0}' input.txt 
Profile suggestion (KDBGHeader): WinXPSP3x86
Profile suggestion (KDBGHeader): WinXPSP2x86

input.txtes un archivo de texto que contiene su entrada de muestra, para realizar pruebas. En su lugar, puede canalizar la salida de su comando directamente a este script awk.

Esto indica awkque se deben utilizar uno o más espacios.oun paréntesis abierto como separador de campos (lo que significa que el quinto campo, $5, contendrá el recuento de procesos o módulos relevantes).

El script awk lee el archivo de entrada y para las líneas que comienzan con "Perfil", captura la línea completa ( $0) en la variable p.

Para líneas que comienzan con "PsA" o "PsL", captura el conteo en variables ao lrespectivamente, desde el quinto campo ( $5).

Finalmente, siempre que ambos ay lsean mayores que 0 y pno estén vacíos, imprime la línea de perfil previamente capturada py restablece las variables a cero y aa la cadena vacía.lp

Alternativamente, si desea solo los nombres de perfil sugeridos (que también se encuentran en el quinto campo de las líneas de perfil):

$ awk -F' +|\\(' '/^Profile/ {p=$5};
                  /^PsA/ {a=$5};
                  /^PsL/ {l=$5};
                  a > 0 && l > 0 && p {print p; p=""; a=0; l=0}' input.txt 
WinXPSP3x86
WinXPSP2x86

información relacionada