пакет java.lang.management действительно дает Вам намного больше информации, чем Время выполнения - например, это даст Вам память "кучи" (ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
) отдельный от памяти не"кучи" (ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
).
можно также получить использование ЦП процесса (не пишущий собственный код JNI), но необходимо бросить java.lang.management.OperatingSystemMXBean
к com.sun.management.OperatingSystemMXBean
. Это работает над Windows и Linux, я не протестировал его в другом месте.
, Например... называют получать getCpuUsage () метод более часто для получения более точных показаний.
public class PerformanceMonitor {
private int availableProcessors = getOperatingSystemMXBean().getAvailableProcessors();
private long lastSystemTime = 0;
private long lastProcessCpuTime = 0;
public synchronized double getCpuUsage()
{
if ( lastSystemTime == 0 )
{
baselineCounters();
return;
}
long systemTime = System.nanoTime();
long processCpuTime = 0;
if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
{
processCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
}
double cpuUsage = (double) ( processCpuTime - lastProcessCpuTime ) / ( systemTime - lastSystemTime );
lastSystemTime = systemTime;
lastProcessCpuTime = processCpuTime;
return cpuUsage / availableProcessors;
}
private void baselineCounters()
{
lastSystemTime = System.nanoTime();
if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
{
lastProcessCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
}
}
}
Да, используйте
grep -B num1 -A num2
для включения num1 строк контекста перед совпадением и num2 строк контекста после совпадения.
EDIT:
Похоже, OP использует AIX. У этого есть другой набор параметров, который не включает -B и -A
эта ссылка описывает grep в AIX 4.3 ( это не выглядит многообещающим )
Perl-скрипт Мэтта может быть лучшим решением.
Конечно, есть (из справочной страницы grep):
-B NUM, --before-context=NUM
Print NUM lines of leading context before matching lines.
Places a line containing a group separator (--) between
contiguous groups of matches. With the -o or --only-matching
option, this has no effect and a warning is given.
-A NUM, --after-context=NUM
Print NUM lines of trailing context after matching lines.
Places a line containing a group separator (--) between
contiguous groups of matches. With the -o or --only-matching
option, this has no effect and a warning is given.
, и если вам нужно такое же количество строк до И после совпадения, используйте:
-C NUM, -NUM, --context=NUM
Print NUM lines of output context. Places a line containing a
group separator (--) between contiguous groups of matches. With
the -o or --only-matching option, this has no effect and a
warning is given.
Судя по тегам, вполне вероятно, что в системе есть команда grep, которая может не поддерживать предоставление контекста (Solaris - это система, которая этого не делает, и я не могу вспомнить об AIX). В этом случае вам может помочь сценарий Perl по адресу http://www.sun.com/bigadmin/jsp/descFile.jsp?url=descAll/cgrep__context_grep .
Если у вас есть sed, вы можете использовать этот сценарий оболочки.
BEFORE=2
AFTER=3
FILE=file.txt
PATTERN=pattern
for i in $(grep -n $PATTERN $FILE | sed -e 's/\:.*//')
do head -n $(($AFTER+$i)) $FILE | tail -n $(($AFTER+$BEFORE+1))
done
Он делает следующее: grep -n префикс каждого совпадения со строкой, в которой он был найден, sed удаляет все, кроме строки, в которой был найден в. Затем вы используете head, чтобы подвести строки к строке, на которой он был найден, плюс дополнительные строки $ AFTER. Затем он передается по конвейеру, чтобы просто получить $ BEFORE + $ AFTER + 1 строк (то есть ваша совпадающая строка плюс количество строк до и после)
вы можете использовать awk
awk 'BEGIN{t=4}
c--&&c>=0
/pattern/{ c=t; for(i=NR;i<NR+t;i++)print a[i%t] }
{ a[NR%t]=$0}
' file
output
$ more file
1
2
3
4
5
pattern
6
7
8
9
10
11
$ ./shell.sh
2
3
4
5
6
7
8
9