Pourquoi sed fonctionne-t-il uniquement sur la sortie directe de l'écho?


3

J'ai une commande shell pour obtenir le temps d'affichage de l'interface utilisateur pour une application Android (qui n'est pas vraiment pertinente pour cette question) en millisecondes. En tout cas, la sortie ressemble à

I/ActivityManager( 1843): Fully drawn com.amazon.android.calypso/com.amazon.android.tv.tenfoot.ui.activities.ContentBrowseActivity: [time]

[heure] est du format +###msou +#s###ms(encore une fois, non pertinent ici).

La commande est la suivante:

adb logcat -d | grep 'Fully drawn' | sed -e 's/^.*: +\(.*\)ms$/\1/' -e 's/s//'

Cela fonctionne comme prévu lorsque j'utilise echopour afficher directement la sortie:

$ echo 'I/ActivityManager( 1843): Fully drawn com.amazon.android.calypso/com.amazon.android.tv.tenfoot.ui.activities.ContentBrowseActivity: +233ms' | sed -e 's/^.*: +\(.*\)ms$/\1/' -e 's/s//'
> 233

$ echo 'I/ActivityManager( 1843): Fully drawn com.amazon.android.calypso/com.amazon.android.tv.tenfoot.ui.activities.ContentBrowseActivity: +1s233ms' | sed -e 's/^.*: +\(.*\)ms$/\1/' -e 's/s//'
> 1233

Cependant, lorsque je l'utilise sur d'autres commandes qui doivent afficher une sortie du même format, sedcorrespond à la ligne entière plutôt qu'à la seule heure de rendu:

$ adb logcat -d | grep 'Fully drawn' | sed -e 's/^.*: +\(.*\)ms$/\1/' -e 's/s//'
> I/ActivityManager( 1843): Fully drawn com.amazon.android.calypo/com.amazon.android.tv.tenfoot.ui.activities.ContentBrowseActivity: +233ms

La même chose se produit lorsque je mets d'abord la sortie dans une variable.

$ out="$(adb logcat -d | grep 'Fully drawn')"                                           
$ echo $out | sed -e 's/^.*: +\(.*\)ms$/\1/' -e 's/s//'
> I/ActivityManager( 1843): Fully drawn com.amazon.android.calypo/com.amazon.android.tv.tenfoot.ui.activities.ContentBrowseActivity: +233ms

Essayé de transférer la sortie dans un fichier texte, pas de dés:

adb logcat -d | grep 'Fully drawn' > temp.txt
cat temp.txt | sed -e 's/^.*: +\(.*\)ms$/\1/' -e 's/s//'
> I/ActivityManager( 1843): Fully drawn com.amazon.android.calypo/com.amazon.android.tv.tenfoot.ui.activities.ContentBrowseActivity: +233ms

Quelqu'un sait pourquoi c'est le cas?


1
adb peut produire des CR / LF de type dos à la fin des lignes. Essayez de passer la $commande de fin dans sed.
Ipor Sircer

Oui, je pense que c'est la cause. J'ai changé le ms$à ms.*$, et cela a résolu le problème. Merci!
Danny Chia

@IporSircer Peut-être rédiger une réponse pour que l'OP puisse fermer le fil?
ejbytes

Réponses:


2

adb produit des CR / LF de type dos à la fin des lignes. Essayez de passer la $commande de fin dans sed.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.