Grep все содержимое файла 1 из файла 2 - PullRequest
0 голосов
/ 10 июля 2019

Это относится к извлечению всех идентификаторов потоков, указанных в одном файле, из файла дампа потоков в unix.

Мне также требуется не менее 5 строк под каждым идентификатором потока из дампа потока во время поиска.

Как показано ниже: - MAX_CPU_PID_TD_Ids.out:

1001
1003

MAX_CPU_PID_TD.txt:

............TDID=1001..................
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7

............TDID=1002...................
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
...........TDID=1003......................
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7

Вывод должен содержать: -

............TDID=1001..................
Line 1
Line 2
Line 3
Line 4
Line 5

...........TDID=1003......................
Line 1
Line 2
Line 3
Line 4
Line 5

Если возможно, я бы хотел, чтобы вышеуказанный вывод был в теле письма.

Я попробовал приведенный ниже код, но он отправляет мне идентификаторы потоков в теле с файлом дампа потока в виде вложения
Как бы то ни было, я хотел бы, чтобы описание каждого идентификатора потока было только в теле письма

JAVA_HOME=/u01/oracle/products/jdk

MAX_CPU_PID=`ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -2 | sed -n '1!p' | awk '{print $1}'`

ps -eLo pid,ppid,tid,pcpu,comm | grep $MAX_CPU_PID  > MAX_CPU_PID_SubProcess.out
cat MAX_CPU_PID_SubProcess.out | awk '{ print "pccpu: "$4" pid: "$1" ppid: "$2" ttid: "$3" comm: "$5}' |sort -n > MAX_CPU_PID_SubProcess_Sorted_temp1.out
rm MAX_CPU_PID_SubProcess.out

sort -k 2n MAX_CPU_PID_SubProcess_Sorted_temp1.out  > MAX_CPU_PID_SubProcess_Sorted_temp2.out
rm MAX_CPU_PID_SubProcess_Sorted_temp1.out

awk '{a[i++]=$0}END{for(j=i-1;j>=0;j--)print a[j];}' MAX_CPU_PID_SubProcess_Sorted_temp2.out > MAX_CPU_PID_SubProcess_Sorted_temp3.out
rm MAX_CPU_PID_SubProcess_Sorted_temp2.out

awk '($2 > 15 ) ' MAX_CPU_PID_SubProcess_Sorted_temp3.out > MAX_CPU_PID_SubProcess_Sorted_Highest_Consuming.out
rm MAX_CPU_PID_SubProcess_Sorted_temp3.out

awk '{ print $8 }' MAX_CPU_PID_SubProcess_Sorted_Highest_Consuming.out > MAX_CPU_PID_SubProcess_Sorted_temp4.out
( echo "obase=16" ; cat MAX_CPU_PID_SubProcess_Sorted_temp4.out ) | bc > MAX_CPU_PID_TD_Ids_temp.out
rm MAX_CPU_PID_SubProcess_Sorted_temp4.out

$JAVA_HOME/bin/jstack -l $MAX_CPU_PID > MAX_CPU_PID_TD.txt
#grep -i -A 10 'error' data

awk 'BEGIN{print "The below thread IDs from the attached thread dump of OUD1 server are causing the highest CPU utilization. Please Analyze it further\n"}1' MAX_CPU_PID_TD_Ids_temp.out > MAX_CPU_PID_TD_Ids.out
rm MAX_CPU_PID_TD_Ids_temp.out

tr -cd "[:print:]\n" < MAX_CPU_PID_TD_Ids.out | mailx -s "OUD1 MAX CPU Utilization Analysis" -a MAX_CPU_PID_TD.txt <My Mail ID>

1 Ответ

0 голосов
/ 10 июля 2019

Ответ за первую часть: Как извлечь строки.

Решение с grep -F -f MAX_CPU_PID_TD_Ids.out -A 5 MAX_CPU_PID_TD.txt, предложенное в комментарии, намного проще, но оно может завершиться неудачей, если строки Line 1 и т. Д. Могут содержать значения из MAX_CPU_PID_TD_Ids.out. Он также может вывести несоответствующую строку TDID=, если после предыдущей совпадающей строки недостаточно строк.
Для решения grep может быть лучше создать файл с такими шаблонами, как ...TDID=1001....

Следующий скрипт напечатает совпадающие строки ...TDID=XYZ... и не более 5 следующих строк. Он остановится через меньшее количество строк, если будет найден новый ...TDID=XYZ....

Для простоты пустая строка печатается перед каждой ...TDID=XYZ... строкой, то есть также перед первой.

awk 'NR==FNR {ids[$1]=1;next} # from the first file save all IDs as array keys
/\.\.\.TDID=/ { 
   sel = 0;        # stop any previous output
   id=gensub(/\.*TDID=([^.]*)\.*/,"\\1",1); # extract ID
   if(id in ids) { # select if ID is present in array
      print ""     # empty line as separator
      sel = 1;
   }
   count = 0;      # counter to limit number of lines
}
sel {              # selected for output?
   print; 
   count++;
   if(count > 5) { # stop after ...TDID= + 5 more lines
      sel = 0     
   }
}' MAX_CPU_PID_TD_Ids.out MAX_CPU_PID_TD.txt > MAX_CPU_PID_TD.extract

Ответ на вторую часть: форматирование почты

Чтобы получить полученные данные в теле письма, вам просто нужно передать их в mailx вместо указания файла в качестве вложения.

( tr -cd "[:print:]\n" < MAX_CPU_PID_TD_Ids.out ; cat MAX_CPU_PID_TD.extract ) | mailx -s "OUD1 MAX CPU Utilization Analysis" <My Mail ID>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...