アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんばんは。

課題でcとJavaのコードを実行してstraceコマンドでその実行時のシステムコールを読み取るという課題をやっています。

Ubuntuの端末でcとJavaのコードをコンパイルし、straceコマンドを実行するとtracefileというのがでてきてそこにずらずらシステムコール(おそらく)が書いてあります。
↓ こんな感じ。

3232 execve("./Noop", ["./Noop"], [/* 39 vars */]) = 0
3232 brk(0) = 0x98c6000

まずこれがシステムコールであっていますか?execveとかがそうですか?
これが6000行くらいあります。

質問はこの中からresumedと書かれたラインを抜かした行数を数え(システムコールの数を数える)、さらにシステムコールの種類の数を数えたいのですがいい方法はありますでしょうか?
便利なコマンドとかあったら使い方とともに教えていただきたいです。

もし何か検討違いなことを言っていたら教えてください。
よろしくお願いします。

A 回答 (2件)

正規表現の問題ですね



最初の ( 以降を取り除くってことでよければ

sed 's/\([^(]*\)(.*/\1/'

かな。
後方参照を使って、行全体を最初の ( の直前までで置き換えてます。

#もっとシンプルな表現もありそうですが・・・

(参考)http://www.kt.rim.or.jp/~kbk/regex/regex.html
    • good
    • 0
この回答へのお礼

おぉ、できました!(以降が全部消えました。

そしたら最初の4ケタの数字も微妙に違っていることに気付いて
\{n\}を使ったら最初の4ケタの数字も消せシステムコールだけでまとめることができました。
あとはuniqとsortとwc使ったらできた、と思います。

とても助かりました。
ありがとうございました。

お礼日時:2012/09/16 14:12

課題ですよね


sedとかawkとかgrepとかperlとかsortとかuniqとかwcとか、色々組み合わせて「いい方法」を見つけるのが醍醐味なので、楽しんで取り組んでください。

> もし何か検討違いなことを言っていたら教えてください。

s/検討違い/見当違い/

この回答への補足

漢字間違い、お恥ずかしい。

先生もsedとuniqが使えるといっていたのでその二つでがんばっているのですが、
3232 execve("./Noop", ["./Noop"], [/* 39 vars */]) = 0
の( 以降を何かに置換してuniqでまとめようとしています。

sed 's/([^(]*$/ XXX/'とし( 以降をXXXで置換しようとしたのですがこれだと( が二回出てくると最後の( 以降しか置換してくれません。
最初の( から末尾までを置換する方法はありますか?
or
もっとスマートな方法がありますか?

よろしくお願いします。

補足日時:2012/09/15 17:55
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!