操作文件的内容以确定死锁

时间:2014-04-19 06:08:51

标签: bash awk sed linked-list

我一直致力于一项简短的任务,以确定数据库中的死锁。为此,我将定期监视进程详细信息,一旦我将其转储到文本文件。

经过一定的操作后要监视的输出文件(微缩版)是:

输入文件: -

SPID   BLOCKING SPID
23       50
71       46
50       60
60       96 

这意味着过程23被过程50阻止,进而被60阻止。 因此,在这种情况下,过程链依赖性是23-> 50-> 60-> 96而另一个71-> 46 总之,我想要最终的罪魁祸首..在这种情况下96和46以及链数(4和2)

输出文件: -

   CULPRIT SPID   CHAIN_COUNT

1) 96                4  
2) 46                2

为此,整个文件必须循环并比较第2列与文件中的任何第1列匹配。必须重复这一过程,直到第2列不匹配为止

我需要通过awk或sed来实现这一点,但我相信这可以通过链接来实现 列表。

任何类型的建议都是欢迎的

**** JS还有一个问题,对于样本文件

SPID   BLOCKING SPID
45       11
12       34
34       35
23       60
71       45
60       71


OUTPUT I RECEIVE:

71=>45
23=>60->71
12=>34->35

OUTPUT I AM SUPPOSED TO GET

23=>60=>71=>45
12=>34->35

我希望你得到我想说的话。

1 个答案:

答案 0 :(得分:2)

让我们尝试分两步解决这个问题。第一步是我们将使用您的输入文件创建链(假设您可以返回并检查跟踪):

awk '
NR>1 {
  for(value in values) {
    if ($1 == values[value]) {
      chain[$1] = chain[value] "->" $2;
      values[$1] = $2;
      delete chain[value];
      delete values[value];
      next
      }
    }
  values[$1] = $2; 
  chain[$1] = $1 "->" $2
}
END {
  for(left in values) {
    for(c in chain) {
      x = split(chain[c],t,/->/)
        if (left == t[x]) {
          chain[left] = chain[c] "->" values[left]
          delete chain[c]
          values[left]
        }
      }
    }
  for (trail in chain) print chain[trail]
}' file

对于您的输入文件,这将输出为:

23->60->71->45->11
12->34->35

现在我们将上面的脚本传递给另一个awk进行格式化。

awk -F'->' '
BEGIN {
  OFS="\t"; 
  print "CULPRIT SPID", "CHAIN_COUNT"
}
{
  print $NF, NF
}'

这将输出为:

CULPRIT SPID    CHAIN_COUNT
11               5
35               3

正如我之前所说的那样假设您需要查看路径。如果跟踪对您没用,那么您可以简单地执行以下操作:

awk '
BEGIN {
  OFS="\t"; 
  print "CULPRIT SPID", "CHAIN_COUNT"
}
NR>1 {
  for(value in values) {
    if ($1 == values[value]) {
      chain[$1] = chain[value] FS $2;
      values[$1] = $2;
      delete chain[value];
      next
    }
  }
  values[$1] = $2; 
  chain[$1] = $1 FS $2
}
END {
  for(left in values) {
    for(c in chain) {
      x = split (chain[c],t)
      if (left == t[x]) {
        chain[left] = chain[c] FS values[left]
        delete chain[c]
        values[left]
      }
    }
  } 
  for(v in chain) {
    num = split(chain[v], culprit)
    print culprit[num], num
  }
}' file 

输出将是:

CULPRIT SPID    CHAIN_COUNT
11               5
35               3

您可以根据需要将其重定向到输出文件。