2015-01-12 5 views
0

я написал команду Баш на тест Grep с пеленального линии:неожиданный результат: Grep с пеленального линии

for i in $(seq 0 9); do echo -e -n "\r"$i; sleep 0.1; done | grep 5 

Результат показывает:

9 


Update

Реальная проблема заключается в следующем:

mplayer показывает и обновляет ход одной строки при воспроизведении медиафайла. Образец результата:

A: 17.2 (17.2) of 213.0 (03:33.0) 0.5% 

И я пытаюсь добиться успеха в этом процессе и перенести другие строки. Я использовал эту команду:

mplayer xxx.mp3 | grep ^A: 

Результат не содержит ожидаемой линии.


Update 2

mplayer xxx.mp3 | od -xda 

показывает:

0002140 4a5b 410d 203a 2020 2e31 2033 3028 2e31 
      [ J \r A :    1 . 3  ( 0 1 . 
     133 112 015 101 072 040 040 040 061 056 063 040 050 060 061 056 
0002160 2932 6f20 2066 3132 2e33 2030 3028 3a33 
      2 )  o f  2 1 3 . 0  ( 0 3 : 
     062 051 040 157 146 040 062 061 063 056 060 040 050 060 063 072 
0002200 3333 302e 2029 3020 342e 2025 5b1b 0d4a 
      3 3 . 0 )   0 . 4 %  033 [ J \r 
     063 063 056 060 051 040 040 060 056 064 045 040 033 133 112 015 
0002220 3a41 2020 3120 352e 2820 3130 342e 2029 
      A :    1 . 5  ( 0 1 . 4 )  
     101 072 040 040 040 061 056 065 040 050 060 061 056 064 051 040 
0002240 666f 3220 3331 302e 2820 3330 333a 2e33 
      o f  2 1 3 . 0  ( 0 3 : 3 3 . 
     157 146 040 062 061 063 056 060 040 050 060 063 072 063 063 056 

И

mplayer xxx.mp3 | tr '\r' '\n' 

показывает

A: 0.2 (00.1) of 213.0 (03:33.0) 0.3% 
A: 0.3 (00.3) of 213.0 (03:33.0) 0.3% 
A: 0.5 (00.5) of 213.0 (03:33.0) 0.4% 
A: 0.6 (00.6) of 213.0 (03:33.0) 0.4% 
A: 0.8 (00.8) of 213.0 (03:33.0) 0.4% 
A: 1.0 (01.0) of 213.0 (03:33.0) 0.4% 

В то время,

mplayer xxx.mp3 | tr '\r' '\n' | grep ^A 

показывает пустой результат.

Любой совет будет оценен.

ответ

1

Это ваше определение «строка», которое вызывает здесь проблему. -n означает, что все числа выводятся на одной линии, в соответствии с определением, используемое grep (серия символов, заканчивающееся на \n характере):

\r1\r2\r3\r4\r5\r6\r7\r8\r9 

Если труба выводится через что-то как шестнадцатеричный дамп, вы можете увидеть, что происходит:

$ for i in $(seq 0 9); do echo -e -n "\r"$i; sleep 0.1; done | grep 5 | od -xcb 
0000000 300d 310d 320d 330d 340d 350d 360d 370d 
     \r 0 \r 1 \r 2 \r 3 \r 4 \r 5 \r 6 \r 7 
     015 060 015 061 015 062 015 063 015 064 015 065 015 066 015 067 
0000020 380d 390d 000a 
     \r 8 \r 9 \n 
     015 070 015 071 012 
0000025 

Это одна строка, содержащая все символы возврата каретки (и не строки) будет, если выход, по всей видимости, будет одна строка с только 9 на нем. Удаление -n приведет вместо этого в:

$ for i in $(seq 0 9); do echo -e "\r"$i; sleep 0.1; done | grep 5 | od -xcb 
0000000 350d 000a 
     \r 5 \n 
     015 065 012 
0000003 

, который будет выглядеть, как только 5 был быть выход.


Если у вас есть процесс, который выводит «линии», разделенных возврата каретки, а не новой строкой, нет ничего, чтобы остановить вас изменяя их на лету так, чтобы быть в состоянии обрабатывать их как реальные строки:

$ echo -e "junk\rA: good 1\rjunk\rA: good 2\rjunk" | tr '\r' '\n' | grep '^A' 
A: good 1 
A: good 2 

Применяя его обратно к первоначальному вопросу, было бы (с sleep удалены, так как это не имеет значения):

$ for i in $(seq 0 9); do echo -e -n "\r"$i; done | tr '\r' '\n' | grep 5 
5 

$ for i in $(seq 0 9); do echo -e -n "\r"$i; done | tr '\r' '\n' | grep 5 | od -xcb 
0000000 0a35 
      5 \n 
     065 012 
0000002 
+0

Спасибо. Если я хочу сохранить 'echo -e -n '\ r" $ i "', можно ли grep из него? 'Echo -e" \ r "$ i' добавляет \ n до конца и не отображает –

+0

Я обновил свое описание: Я пытаюсь выполнить последовательность воспроизведения игры mplayer. –

+0

@ Jonny, см. мое обновление, это просто вопрос превращения этих псевдо-линий в реальные строки. – paxdiablo