从终端的命令输出中提取单行

Extract single line from command output in terminal

我想从我正在处理的一些日志记录脚本的 perf stat 输出中提取包含 'seconds time elapsed' 输出的行。

我不想将输出写入文件然后搜索文件。我想用 '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 等工具的新手。我希望有人能帮助我。我也不想将输出写入文件然后搜索文件。

这里的问题是你想要的输出被发送到 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的stderr重定向到标准输出,并隐藏标准输出。这样,perf 的输出将被发送到 grep 命令。

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

看起来你想要的输出是 stderr。尝试:

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

这可以按照您的预期工作:

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

输出:

0.000544399 seconds time elapsed                                          ( +-  2.05% )