Grep文件2中文件1的所有内容

时间:2019-07-10 10:57:34

标签: shell unix

这与从unix的线程转储文件中提取一个文件中提到的所有线程ID有关。

在grepping时,我还需要从线程转储的每个线程ID下方至少保留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

如果可能的话,我希望在邮件正文中包含以上输出。

我尝试了以下代码,但它向我发送了带有线程转储文件作为附件的正文中的线程ID。
我多么想仅在邮件正文中获得每个线程ID的描述

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 :(得分:0)

第一部分的答案:如何提取线条。

在注释中使用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>