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