なぜsedはエコーからの直接出力でのみ動作するのですか


3

AndroidアプリのUI描画時間を取得するためのシェルコマンドがあります(この質問には実際には関係ありません)。とにかく、出力は次のようになります

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

ここで、[時間]の形式である+###msか、+#s###ms(ここでも、関係がありません)。

コマンドは次のとおりです。

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

echo出力を直接表示するために使用すると、期待どおりに機能します:

$ 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

ただし、同じ形式の出力を表示する他のコマンドで使用するとsed、レンダリング時間だけでなく行全体が一致します。

$ 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

最初に出力を変数に入れたときにも同じことが起こります。

$ 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

サイコロなしでテキストファイルに出力をダンプしようとしました。

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

なぜそうなのか誰でも知っていますか?


1
adbは行末にdosのようなCR / LFを生成する場合があります。$sedコマンドの末尾をスキップしてみてください。
IPOR Sircer

ええ、それが原因だと思います。私は変更ms$ms.*$て、それが問題を解決しました。ありがとう!
ダニー・チア

@IporSircerおそらく、OPがスレッドを閉じることができるように、回答として書き上げてください。
ejbytes

回答:


2

adbは、行末にdosのようなCR / LFを生成します。$sedコマンドの末尾をスキップしてみてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.