bash - 操作文件内容以确定死锁

标签 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

我希望你明白我想说的。

最佳答案

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

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

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

关于bash - 操作文件内容以确定死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23166577/

相关文章:

linux - 使用 while/read/do 将文件内容作为命令的参数传递

linux - 可以让 awk 使用 `exit 2` 退出 bash 脚本吗?

regex - 使用 sed 在模式之前将文件内容插入到文件中

linux - 如何在以 <fc=ff00> 开头的行后添加字符串 “</font>”,但不添加连续的两行?

Bash 脚本无法从列表中下载源包

bash - Cygwin安装: Package: bash; bash. sh退出代码1

bash - 无法在 Azure Powershell 中键入密码

Linux - awk 选择

linux - awk 或 perl one liner + 使用 awk one liner 命令验证数组值

linux - 提取部分文件名