2017-01-06 2 views
2

Я хотел бы извлечь строку, содержащую вывод «секундное время» с выхода perf stat для некоторого сценария регистрации, над которым я работаю.Извлечение одной строки из командного выхода в терминале

Я не хочу записывать вывод в файл, а затем искать файл. Я хотел бы сделать это, используя «grep» или что-то подобное.

Вот что я пробовал:

perf stat -r 10 echo "Sample_String" | grep -eE "seconds time elapsed" 

За что я получаю

grep: seconds time elapsed: No such file or directory 
    echo: Broken pipe 
    echo: Broken pipe 
    echo: Broken pipe 
    echo: Broken pipe 
    echo: Broken pipe 
    echo: Broken pipe 
    echo: Broken pipe 
    echo: Broken pipe 
    echo: Broken pipe 

    Performance counter stats for 'echo Sample_String' (10 runs): 

     0.254533  task-clock (msec)   # 0.556 CPUs utilized   (+- 0.98%) 
      0  context-switches   # 0.000 K/sec     
      0  cpu-migrations   # 0.000 K/sec     
      56  page-faults    # 0.220 M/sec     (+- 0.53%) 
     <not supported>  cycles     
     <not supported>  stalled-cycles-frontend 
     <not supported>  stalled-cycles-backend 
     <not supported>  instructions    
     <not supported>  branches     
     <not supported>  branch-misses    

    0.000457686 seconds time elapsed           (+- 1.08%) 

И я попробовал этот

perf stat -r 10 echo "Sample_String" > grep -eE "seconds time elapsed" 

За что я получил

Performance counter stats for 'echo Sample_String -eE seconds time elapsed' (10 runs): 

     0.262585  task-clock (msec)   # 0.576 CPUs utilized   (+- 1.11%) 
      0  context-switches   # 0.000 K/sec     
      0  cpu-migrations   # 0.000 K/sec     
      56  page-faults    # 0.214 M/sec     (+- 0.36%) 
    <not supported>  cycles     
    <not supported>  stalled-cycles-frontend 
    <not supported>  stalled-cycles-backend 
    <not supported>  instructions    
    <not supported>  branches     
    <not supported>  branch-misses    

    0.000456035 seconds time elapsed           (+- 1.05%) 

Я новичок в таких инструментах, как grep, awk и sed. Надеюсь, кто-то может мне помочь. Я также не хочу записывать вывод в файл, а затем искать файл.

ответ

1

Проблема заключается в том, что вывод, который вы хотите, отправляется на stderr вместо стандартного вывода.

Вы можете увидеть это, перенаправляя stderr на/dev/null, и вы увидите, что остался единственный результат, полученный от команды «echo».

~/ perf stat -r 10 echo "Sample_String" 2>/dev/null 
Sample_String 
Sample_String 
Sample_String 
Sample_String 
Sample_String 
Sample_String 
Sample_String 
Sample_String 
Sample_String 
Sample_String 

Для того, чтобы сделать то, что вы хотите, вы должны перенаправить поток ошибок perf «s на стандартный вывод, и скрыть стандартный вывод. Таким образом, вывод perf будет отправлен команде grep.

~/ perf stat -r 10 echo "Sample_String" 2>&1 >/dev/null | grep 'seconds time elapsed'  
     0,013137361 seconds time elapsed           (+- 96,08%) 
+0

Спасибо, это сработало. Что делает «2> & 1» и что это значит? –

+0

Он перенаправляет stderr на stdout. См. Это сообщение для получения дополнительной информации: http://stackoverflow.com/a/2342841/2679935 – julienc

1

Похоже, ваш желаемый результат будет stderr. Попробуйте:

perf stat -r 10 echo "Sample_String" 2>&1 | grep "seconds time elapsed" 
+0

Ваш не работает. Я получаю эту ошибку: «grep: секунды прошло: нет такого файла или каталога» –

+0

Теперь это работает. Благодаря! Что делает 2> & 1 и что называется? –

+1

@SriHariVignesh Unix стандартный файл Дескрипторы: https://en.wikipedia.org/wiki/File_descriptor 0 - STDIN 1 - стандартный вывод 2 - STDERR '2> $ 1' - перенаправляет STDERR на стандартный вывод, который передается по конвейеру' grep' – helloV

1

Это может работать так, как вы собираетесь:

grep -e "seconds time elapsed" <<< "$(perf stat -r 10 echo "Sample_String" 2>&1 >/dev/null)" 

Выход:

0.000544399 seconds time elapsed           (+- 2.05%) 
+0

Спасибо, это сработало. что называется «<<<»? –

+0

Это называется «Here String». См .: http://www.gnu.org/software/bash/manual/bashref.html#Here-Strings –

Смежные вопросы