5489


PC の `bash` から `adb shell` に入り、連続して `cat` を実行した結果を、カンマ区切りの CSV で PC へと保存したいです。

列1 に項目名を、列2 に `cat` した結果を保存する方法をご教示いただけませんでしょうか。

スクリプト:

[code]

    #!/usr/bin/bash -v              
    echo "項目1"  >> hogelist.txt
    adb shell cat /proc/sys/net/ipv4/tcp_sack     >> hogelist.txt
    echo "項目2"  >> hogelist.txt
    adb shell cat /proc/sys/net/core/rmem_max     >> hogelist.txt
    echo "項目3"  >> hogelist.txt
    adb shell cat /proc/sys/net/ipv4/tcp_rmem     >> hogelist.txt
    
[/code]

現在の出力結果 ( `hogelist.txt` )

[code]

    項目1
    1
    項目2
    163840
    項目3
    4098    46284   1094304
    
[/code]

出力したい結果 ( `hogelist.csv` )

[code]

    項目1,1
    項目2,163840
    項目3,4098    46284   1094304
    
[/code]


CC BY-SA 3.0
2015-01-28T04:14:31.983
5484
2015-01-30T08:21:36.587
2015-01-30T08:21:36.587
4978
7590
question
android bash sh adb
連続して cat を実行した結果を、カンマ区切りの CSV で保存したい（ adb shell ）


ちょっと質問の意図を正しく読み取れているか不安ですが、こういうことでしょうか?

[code]

    $ cat a
    koumoku1
    koumoku2
    koumoku3
    $ cat b
    111
    222
    333
    $ paste -d',' a b
    koumoku1,111
    koumoku2,222
    koumoku3,333
    
[/code]


CC BY-SA 3.0
2015-01-28T04:23:33.157
5486
2015-01-28T04:23:33.157
4508
5484
answer


それでは以下の様になります。

[code]

    $ awk 'NR%2{printf("%s,", $0)} !(NR%2)' hogelist.txt
    
[/code]

# もっとも、元のシェルスクリプトだけで最終結果を出力する方が良いかと思いますが。

追記:

bash ということで、元のシェルスクリプトを以下の様にすることもできるでしょう。

[code]

    #/usr/bin/bash
    
    declare -a input
    input=(
      /proc/sys/net/ipv4/tcp_sack
      /proc/sys/net/core/rmem_max
      /proc/sys/net/ipv4/tcp_rmem
    )
    
    declare -i i=0
    for f in ${input[@]}
    do
      printf "項目%d, %s\n" $((i+1)) "$(adb shell cat ${input[$i]})"
      : $((i++))
    done
    
[/code]

ただ、adb shell を使った場合を試していないので、その場合は期待する結果を得られないかもしれません。

追記２:

ご存じの方も多いでしょうが、bash には `printf` という **ビルトインコマンド** が存在します。

[code]

    $ type printf
    printf is a shell builtin
    
[/code]

`/usr/bin/printf` コマンドに対して、いくつかの書式指定文字列が追加されています。

[code]

    $ help printf
          :
    %b expand backslash escape sequences in the corresponding argument
    %q quote the argument in a way that can be reused as shell input
    
[/code]

これらは、状況によっては便利なこともあります。ご参考までにどうぞ。


CC BY-SA 3.0
2015-01-28T04:29:29.693
5487
2015-01-28T07:12:40.653
2015-01-28T07:12:40.653
5484
answer


`echo -n` だけでも行ける気がしました。

[code]

    #!/usr/bin/bash -v              
    
    echo -n "項目1,"  >> hogelist.txt
    adb shell cat /proc/sys/net/ipv4/tcp_sack     >> hogelist.txt
    echo -n "項目2,"  >> hogelist.txt
    adb shell cat /proc/sys/net/core/rmem_max     >> hogelist.txt
    echo -n "項目3,"  >> hogelist.txt
    adb shell cat /proc/sys/net/ipv4/tcp_rmem /hoge3     >> hogelist.txt
    
[/code]

_Output_ :

[code]

    $ cat hogelist.txt
    項目1,1
    項目2,163840
    項目3,4098    46284   1094304
    
[/code]

_man_ : `LANG=ja_JP.UTF-8 man echo`

> 名前  
>  echo - 1 行のテキストを表示する  
>  ...
>
> 説明  
>  STRING を標準出力に出力する
[code]

>        -n     最後に改行を出力しない
>  
[/code]


CC BY-SA 3.0
2015-01-28T04:54:26.650
5488
2015-01-28T04:54:26.650
4978
5484
answer


多くの OS の `sh` (bash, zsh も含む) の組込みコマンド `echo` は、`-n` オプションで改行を抑制できます。

[code]

    #!/bin/sh
    echo -n "項目1,"  >> hogelist.txt
    adb shell cat /proc/sys/net/ipv4/tcp_sack     >> hogelist.txt
    echo -n "項目2,"  >> hogelist.txt
    adb shell cat /proc/sys/net/core/rmem_max     >> hogelist.txt
    echo -n "項目3,"  >> hogelist.txt
    adb shell cat /proc/sys/net/ipv4/tcp_rmem /hoge3     >> hogelist.txt
    
[/code]

しかし、Solaris など SYSV 系の OS の `sh` の `echo` では `-n`
オプションはサポートしていません。代わりに、出力したい文字列の最後に `\c` を付与します。

[code]

    #!/bin/sh
    echo "項目1,\c"  >> hogelist.txt
    adb shell cat /proc/sys/net/ipv4/tcp_sack     >> hogelist.txt
    echo "項目2,\c"  >> hogelist.txt
    adb shell cat /proc/sys/net/core/rmem_max     >> hogelist.txt
    echo "項目3,\c"  >> hogelist.txt
    adb shell cat /proc/sys/net/ipv4/tcp_rmem /hoge3     >> hogelist.txt
    
[/code]


CC BY-SA 3.0
2015-01-28T04:55:00.960
5489
2015-01-28T05:44:48.053
2015-01-28T05:44:48.053
7590
3061
5484
answer


今 adb の環境が手元にないので分かりませんが、コマンド置換では出来ないでしょか？

[code]

    adb shell echo 項目1,`cat /proc/sys/net/ipv4/tcp_sack` >> hogelist.txt
    adb shell echo 項目2,`cat /proc/sys/net/core/rmem_max` >> hogelist.txt
    adb shell echo 項目3,`cat /proc/sys/net/ipv4/tcp_rmem` >> hogelist.txt
    
[/code]

**追記**

[code]

    adb shell sh -c "echo 項目1,`cat /proc/sys/net/ipv4/tcp_sack` >> hogelist.txt"
    adb shell sh -c "echo 項目2,`cat /proc/sys/net/core/rmem_max` >> hogelist.txt"
    adb shell sh -c "echo 項目3,`cat /proc/sys/net/ipv4/tcp_rmem` >> hogelist.txt"
    
[/code]

**さらに追記**

[code]

    adb shell sh -c "echo 項目1,`cat /proc/sys/net/ipv4/tcp_sack`" >> hogelist.txt
    adb shell sh -c "echo 項目2,`cat /proc/sys/net/core/rmem_max`" >> hogelist.txt
    adb shell sh -c "echo 項目3,`cat /proc/sys/net/ipv4/tcp_rmem`" >> hogelist.txt
    
[/code]


CC BY-SA 3.0
2015-01-28T06:31:22.820
5497
2015-01-28T07:38:27.390
2015-01-28T07:38:27.390
440
440
5484
answer