Усовершенствованный grep Unix

пакет 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();
        }
    }
}

5
задан Sachin Chourasiya 9 November 2009 в 07:40
поделиться

5 ответов

Да, используйте

grep -B num1 -A num2 

для включения num1 строк контекста перед совпадением и num2 строк контекста после совпадения.

EDIT:

Похоже, OP использует AIX. У этого есть другой набор параметров, который не включает -B и -A

эта ссылка описывает grep в AIX 4.3 ( это не выглядит многообещающим )

Perl-скрипт Мэтта может быть лучшим решением.

7
ответ дан 18 December 2019 в 14:47
поделиться

Конечно, есть (из справочной страницы 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.
0
ответ дан 18 December 2019 в 14:47
поделиться

Судя по тегам, вполне вероятно, что в системе есть команда grep, которая может не поддерживать предоставление контекста (Solaris - это система, которая этого не делает, и я не могу вспомнить об AIX). В этом случае вам может помочь сценарий Perl по адресу http://www.sun.com/bigadmin/jsp/descFile.jsp?url=descAll/cgrep__context_grep .

1
ответ дан 18 December 2019 в 14:47
поделиться

Если у вас есть 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 строк (то есть ваша совпадающая строка плюс количество строк до и после)

1
ответ дан 18 December 2019 в 14:47
поделиться

вы можете использовать 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
0
ответ дан 18 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: