awk
отличный язык:
awk '
/PID/{
# store the line with PID NAME BLA BLA
pidline=$0;
# alse remember the line with ----------------------- minuses
getline;
minusline=$0
}
/mibd_interface/{
# remember the line with mibd_interface
mibdlines[mibdlen++]=$0;
# calculate some-things
diff += $5;
timediff += $6
}
# finally output!
END{
# output the PID NAME ...
print pidline;
# output ------------
print minusline;
# output the mibd_interface lines
for (i in mibdlines) print mibdlines[i];
# another ------------ line
print minusline;
# and output the difference, printf is there for a simple formatting
printf "%56s%-12d%-d\n"," ",diff,timediff
}'
или oneliner:
awk '/PID/{pidline=$0;getline;minusline=$0} /mibd_interface/{mibdlines[mibdlen++]=$0; diff += $5; timediff += $6} END{ print pidline; print minusline; for (i in mibdlines) print mibdlines[i]; print minusline; printf "%56s%-12d%-d\n"," ",diff,timediff}'
при подаче на входы:
PID NAME MEM BEFORE MEM AFTER DIFFERENCE MALLOCS-NEW
-------------------------------------------------------------------------------
7582 mibd_interface 8670334 8484152 -186182 267657
7582 mibd_interface 8369050 8514825 145775 126259
7582 mibd_interface 8446906 8264885 -182021 322280
7582 mibd_interface 8264884 8264960 76 284409
-------------------------------------------------------------------------------
-222352 1000605
Насо второй попытки нет необходимости хранить строки с mbd_interface, поэтому мы можем просто вывести их по мере их поступления:
awk '
/PID/{
if(once == 0) {
#output the PID NAME line
print;
# output and remember the -------------- line
getline;
minusline=$0;
print;
}
once=1
}
/mibd_interface/{
# output the mibd line
print;
# calculate some-things
diff += $5; timediff += $6
}
END{
# print another minus line
print minusline;
# print the calculated some-things
printf "%56s%-12d%-d\n"," ",diff,timediff
}'
, которая выдает то же самое. Или вкладыш:
awk '/PID/{if(once == 0) { print; getline; minusline=$0; print; } once=1 } /mibd_interface/{print; diff += $5; timediff += $6} END{ print minusline; printf "%56s%-12d%-d\n"," ",diff,timediff}'