Bash 按用户/主机/工作区总和结果分析文件

Bash 按用户/主机/工作区总和结果分析文件,bash,awk,sed,grep,Bash,Awk,Sed,Grep,我有一个由另一个人的脚本生成的文件,如下所示:(高度截断的示例) 换句话说,用户在上面的文件中,我们可以解释我们所看到的,即 User: Host: Workspace: <size on that workspace MB> 然后得到像这样的东西:(截断) 这可以是一种方式: $ awk '!/^ / {name=$1; next} NF==3{a[name]+=$2} END {for (i in a) print i, a[i]/1024, "GB"}' file

我有一个由另一个人的脚本生成的文件,如下所示:(高度截断的示例)

换句话说,用户在上面的文件中,我们可以解释我们所看到的,即

User:
  Host:
    Workspace: <size on that workspace MB>
然后得到像这样的东西:(截断)

这可以是一种方式:

$ awk '!/^ / {name=$1; next} NF==3{a[name]+=$2} END {for (i in a) print i, a[i]/1024, "GB"}' file
adallman: 44.4512 GB
ahoang: 2.82812 GB
afkham: 100.064 GB
akrishna: 130.134 GB
agnewjo: 71.7812 GB
解释
  • 它以用户名的形式获取那些不以空格开头的行
  • 对于所有这些,它会在第2列中不断添加值
  • 最后,它打印结果除以1024,表示GB
    • 纯bash解决方案(从stdin读取文件):


      如果您显示了所显示的输入所需的确切输出,这将很有帮助。
      包含哪些内容?在上面的示例中,用户名不缩进,主机名缩进2,这些主机上的工作区被进一步缩进,但我在VPN上失去了连接,我会在重新连接时尝试,谢谢:)这一个可能会工作,但脚本花费了很长时间,即使我使用-x运行它,但在它通过有效的用户列表后,它似乎挂起了。也许只是在做些事情,我应该等着。我会让这一个运行一整晚。太棒了,我在VPN上失去了连接,我回来后会试试。谢谢:)很高兴读到:)你可以这样做,单击答案旁边的复选标记,将其从空心切换到绿色。看看你是否有任何疑问!如果我使用awk{print$2}sort-n-r,它将对大小进行排序,但不会将用户与其大小保持在一起。你有办法做到这一点吗?还有@BrianBills将其导入
      | sort-nrk2
      现在,如果我想过滤任何超过100GB的用户,该怎么办
      adallman: <total in GB>
        afkham: <total in GB>
       agnewjo: <total in GB>
        ahoang: <total in GB>
      
      ypcat passwd | cut -d: -f1 > valid_users
      
      zahrobsk
      mylonopo
      alindema
      sutterk
      sstslim
      wleung
      pazgil
      
      $ awk '!/^ / {name=$1; next} NF==3{a[name]+=$2} END {for (i in a) print i, a[i]/1024, "GB"}' file
      adallman: 44.4512 GB
      ahoang: 2.82812 GB
      afkham: 100.064 GB
      akrishna: 130.134 GB
      agnewjo: 71.7812 GB
      
      #!/bin/bash
      
      valid_users=$( ypcat passwd | cut -d: -f1 )
      
      declare -A sizes
      
      while read username size foo
      do
        if [ "$foo" = "MB" ]
        then
          let sizes[$username]=$(( sizes[$username] + $size ))
        fi
      done
      
      for i in $valid_users
      do
        GB=$(( ${sizes[$i]:-0} / 1024 ))
        echo "$i: $GB"
      done