从行中提取字段并使用awk进行数学运算

时间:2013-10-12 05:30:48

标签: awk

我有一个来自solaris主机的df输出,我只需要显示所需的输出,并且还想在两个值之间进行数学运算(减法)并显示其输出。

bash-2.03# df -t /fsystem
/fsystem          (filer:/vol/volname/filesys): 3790340712 blocks 14310983 files
                                  total: 21616671840 blocks 30443110 files
bash-2.03#

预期产出:

/fsystem  filer:/vol/volname/filesys 16132127

其中16132127是减法的输出(30443110 - 14310983)。 更喜欢在awk脚本的一行中执行此操作。

我可以从下面的命令中提取所需的值,但无法进行数学运算并获得首选输出。

bash-2.03#df -t / fsystem | awk'(NR == 1){print $ 1“”$ 2“”$ 5}(NR == 2){print $ 4}'

/ fsystem(filer:/ vol / volname / filesys):14310983

30443110

的bash-2.03#

解决方案都没有工作可能是命令输出格式化并不是每个人都能理解的。以下输出可能有帮助

bash-2.03 $ df -t / fsystem | awk'{print $ 1}'

/ FSYSTEM

总:

bash-2.03 $ df -t / fsystem | awk'{print $ 4}'

30443110

bash-2.03 $ df -t / fsystem | awk'{print $ 5}'

14310982

文件

bash-2.03 $

5 个答案:

答案 0 :(得分:1)

A="/fsystem (filer:/vol/volname/filesys): 3790340712 blocks 14310983 files total: 21616671840 blocks 30443110 files"
echo $A|awk '{print $10 - $5}'

16132127

答案 1 :(得分:0)

有些人喜欢这样:

df -t /fsystem | awk -F"**" '{s=$6;f=$2" "$4;getline;print f,"("$2" - ",s")"}'
/fsystem filer:/vol/volname/filesys (30443110 -  14310983)

答案 2 :(得分:0)

编辑 :(输入示例已被编辑更改!)尝试使用此命令忽略awk中的换行符:

dt -t /fsystem  | awk 'BEGIN { RS = ""}; { C=$10 - $5; printf "%s %s\t%d\n",$1,$2,C}'

示例输出:

/fsystem (filer:/vol/volname/filesys): 16132127

如果您不想要所有介绍性文本,请替换命令的printf部分,但要显示输出部分。例如:

printf "%s %d\n",$1,C

这给出了:

/fsystem 16132127

答案 3 :(得分:0)

更一般地说

df -t /ptsadmin |
awk -F '[ \t()]+' '/^total:/ { f=$3; next }
    { sub(/:$/,"",$2; d[NR]=$1" "$2; v[NR]=$5}
    END{ for(i=1; i<NR; ++i)
        print d[i] " " v[i]-f }'

通过()选项将FS添加到-F负责删除它们。从$2删除最终冒号是由sub()完成的。

答案 4 :(得分:0)

$ awk -v RS= '{gsub(/^\(|\):$/,"",$2); print $1, $2, ($10 - $5)}'
/fsystem filer:/vol/volname/filesys 16132127

如果您在名称中包含(,)或:,则必须使用gsub()而不是设置FS。如果你的名字可以包含空格,这将不起作用 - 如果你遇到这种情况,这将成为一个更加严峻的问题。