人に聞けない痔の悩み、これでスッキリ >>

お世話になります。
現状、以下のログがあるのですが、

<snip>
日時, 通信開始時刻, 通信終了時刻・・・
2008/4/8, 14:00:00.3, 14:10:00.5, ・・・
<snip>

で、AWK(awk -F , )にて時刻差分を取得したいと考えたのですが、
$3-$2の出力結果が"0""-1"になり、表示されません。

うまく時刻差分を取得する方法はないでしょうか。
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

基準時点からの経過秒数を返すのや日時の書式を整形するのはあるけど、A-Bのように直接日時を計算するような関数はなかったと思います。



他の言語でもそうですが、時間(文字列)を秒数に変換してから、計算するようにして下さい。

時間表記が「hh:mm:ss」の場合

num = split($2,time,":")
$2 = time[1] * 60 * 60 + time[2] * 60 + time[3]
num = split($3,time,":")
$3 = time[1] * 60 * 60 + time[2] * 60 + time[3]

$3 - $2

で経過秒が得られます。

参考URL:http://www.linux.or.jp/JM/html/GNU_gawk/man1/gaw …
    • good
    • 0
この回答へのお礼

ありがとうございました。大変助かりました。
すこし、タイトルとそれるのですが、

$ gawk -F, -f exam.awk data.txt
92
101.7
60
55.2

計算後の、出力された結果をまとめて合計することってできますでしょうか。

お礼日時:2008/04/14 13:51

変数に時刻差分の合計を入れて、ENDで最後にそれを出力するようにすればいいです。



{
#ファイル読み込んで、差分を求める処理
jikan = $3-$2;
total += jikan; #差分の合計
}

END{
#最後に実行される処理
print "合計 " total " 秒";
}


↓でも一通り読めば、大雑把な使い方は理解出来ます。
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manua …

参考URL:http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manua …
    • good
    • 0
この回答へのお礼

参考にさせていただきます。AWKは独特ですねぇ。
勉強になります。

お礼日時:2008/04/14 17:03

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

Q【シェルスクリプト】awkの結果を変数に格納したいです。

【シェルスクリプト】awkの結果を変数に格納したいです。

パイプを使って、3つのコマンドを実行し、変数に格納したいです。
command1 | command2 | command3

command2 には grep が、
command3 には awk が入ります。

よろしくお願いします。

Aベストアンサー

「結果」ってどれのことでしょう?
終了ステータスなら、最終段階のものが$?とかに入るはず。

command3の出力を文字列として変数に入れるなら、全部をバッククオートでくくるればいいです
`command1 | command2 | command3`

QAWKで1項目以外を簡単に出力したい

awkのprint出力で$1$2$3$4$5$6と書くのではなく、$1から$6までを簡潔に指定できる方法はありませんか? (たとえば$1-$6のような)
すべて出力したい場合は$0でいいのですが、1項目だけ除外してあとはすべて出力したい時に項目が多い大変ですから。

Aベストアンサー

最後のフィールドだけ消せばいいのなら、組み込み変数NFをデクリメント
してやればいいです。$7=""だと中身が空のフィールドになるだけなので
余計なセパレータが出力されるように見えているのです。

ひょっとしたらNFをデクリメントしたあとで$0の再構築を
強制的にさせる必要があるかもしれません($0=$0 とか $1=$1で
やってくれるはず)。

Qgrepで日付指定してlogを取り出したい

あるアカウントの maillog を、日付指定して取り出したいんだけど、
以下に何を付け足したりすればいいかわかりません。
そもそも(パイプで?)付け足せば済むことなのかもわかりませんし。。。

grep imap /var/log/maillog | grep アカウント

日付の正しい記述も判らないです。
正しいコマンドや便利な抽出方法があれば教えていただけますでしょうか。

Aベストアンサー

やり方は人それぞれに色々あると思いますが一例として
e.g. 「3/2」の「あるアカウント」さんを含む行を maillog から抽出

egrep '^Mar[ ]+2' /var/log/maillog | grep 'あるアカウント'  や
awk 'BEGIN{ORS="\n\n"}/^Mar[ ]+2/ && /あるアカウント/' /var/log/maillog  など

Q時刻フォーマットの編集

時刻フォーマットの編集方法について
教えてください。

以下の様な時刻(CLF の時刻の書式)を
YYYYMMDDの形に変更したいのですが
何かいい案を頂けないでしょうか?
--------------------
26/Mar/2005:18:22:15 +0900
--------------------

可能ならば、Linuxのコマンド(awkコマンド等)で
行いたいのですが、JAVAなどでコーディングしないと駄目でしょうか??

※具体的にいえば、Apacheが出力しているログ内の
 日付書式をYYYYMMDDの形で取得したいのです。

Aベストアンサー

apacheのログだと4カラム目ですね。
[09/Mar/2006:01:55:47 +0900]

awk 'BEGIN{M["Jan"]="01";M["Feb"]="02";中略;M["Dec"]="12"}
{DD=substr($4,2,2);MM=M[substr($4,5,3)];YYYY=substr($4,9,4)
$4="[" YYYY MM DD substr($4,13);print}' access_log >access_log.out

Qgrepで検索文字列が完全一致した行だけ取り出す方法

grepの文字列検索で検索文字列が単語として、完全一致した行だけ取り出す方法はないでしょうか?

通常は
grep hoge hoge.txt

と打つと、hogeが含まれる行が出力されますが、今回は含まれる行ではなくて完全に文字列が一致した行だけ取り出したいのです。

例えばhoge.txtの中に
cc ghoge
kkl hogem
jjll hoge
という3行があったとしたら最後の行でhogeという文字が空白で区切られた行だけ取り出したいのです。

何かよい方法があれば教えてください

Aベストアンサー

-w オプションじゃだめですか?

参考URL:http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html

Q時間を計算する方法

ログなどに実行した時間と終了した時間が表示される
のですが、実行にかかった時間を計算したいと考えております。

例:
10:22:01.012,10:23:10.234
^^^^^^^^^^^^ ^^^^^^^^^^^^
↑実行時間  ↑終了時間


上記のようなログが表示される場合で、実行にかかった
時間を計算する方法はないでしょうか?
ずっと考えていたのですが、良い方法が思いつきません。perlとかでは出来そうですが、solarisで行いたいと考えています。

ご教授頂ければ幸いです。よろしくお願いします。

Aベストアンサー

ログが複数行あるとして、
開始時刻,終了時刻 テキスト

開始時刻,終了時刻,経過時間 テキスト
に書き換えることを考えるとします。かなり面倒ですが、↓

#! /bin/sh
IFS=" :.,"
while read H1 M1 S1 T1 H2 M2 S2 T2 TEXT
do
X=`expr $H1 \* 3600000 - $M1 \* 60000 - $S1 \* 1000 + $T1`
Y=`expr $H2 \* 3600000 + $M2 \* 60000 + $S2 \* 1000 + $T2`
if test $X -gt $Y ;then Y=`expr $Y + 86400000`;fi
W=`expr $Y - $X`
T=`expr $W % 1000`
W=`expr $W / 1000`
S=`expr $W % 60`
W=`expr $W / 60`
M=`expr $W % 60`
H=`expr $W / 60`
T=`expr 00$T : '.*\(...\)'`
S=`expr 0$S : '.*\(..\)'`
M=`expr 0$M : '.*\(..\)'`
H=`expr 0$H : '.*\(..\)'`
IFS=" "
echo "$H1:$M1:$S1.$T1,$H2:$M2:$S2.$T2,$H:$M:$S.$T $TEXT"
IFS=" :.,"
done < logfile.txt >logfileout.txt

ログが複数行あるとして、
開始時刻,終了時刻 テキスト

開始時刻,終了時刻,経過時間 テキスト
に書き換えることを考えるとします。かなり面倒ですが、↓

#! /bin/sh
IFS=" :.,"
while read H1 M1 S1 T1 H2 M2 S2 T2 TEXT
do
X=`expr $H1 \* 3600000 - $M1 \* 60000 - $S1 \* 1000 + $T1`
Y=`expr $H2 \* 3600000 + $M2 \* 60000 + $S2 \* 1000 + $T2`
if test $X -gt $Y ;then Y=`expr $Y + 86400000`;fi
W=`expr $Y - $X`
T=`expr $W % 1000`
W=`expr $W / 1000`
S=`expr $W % 60`
W=`expr $...続きを読む

Qsedなどで、特定の文字列の後の文字列を抽出したい

sedなどで、特定の文字列の後の文字列を抽出したい

シェルスクリプト内で、sedなどを使って特定の文字列の後の文字列を抽出したいのですが、どうすればいいでしょうか?

たとえば、abcXYZ123defghiのなかから、XYZの後の「123」を抜き出したいです。

echo abcXYZ123defghi | sed ...

のようにして実行させたいです。

Aベストアンサー

日本語対応sedだと日本語数字混じりでもできますね。

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/' -e 'y/0123456789/0123456789/'
12357

※ 使っている日本語コードの指定は必要かも(例えば、 --ctype=EUC)

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/'
12357

※ 入力フォームに書いている時はASCIIと日本語の判別がし易いけど回答見るとわかり難いですね。後ろの例での結果57とy/0123456789/の数字部分が日本語です。

Qlinuxコマンド(時間の抽出について)

ログに時間が記載されています。
現在時刻から5分以内のものをgrep等のコマンドを利用し抽出することは可能でしょうか?
(シェルを利用する形になりますか?)
よろしくお願いします。

例:secure_log
May 30 20:41:14 linux sshd[26963]: Received disconnect from 10.0.0.1: 2: disconnected
by server request
May 30 20:51:40 linux sshd[27001]: Accepted password for linux from 10.0.0.1 port 3579
ssh2
May 30 20:53:42 linux sshd[27003]: Received disconnect from 10.0.0.1: 2: disconnected
by server request
May 31 08:39:10 linux sshd[27501]: Accepted password for linux from 10.32.27.98 port 1099 ss
h2

ログに時間が記載されています。
現在時刻から5分以内のものをgrep等のコマンドを利用し抽出することは可能でしょうか?
(シェルを利用する形になりますか?)
よろしくお願いします。

例:secure_log
May 30 20:41:14 linux sshd[26963]: Received disconnect from 10.0.0.1: 2: disconnected
by server request
May 30 20:51:40 linux sshd[27001]: Accepted password for linux from 10.0.0.1 port 3579
ssh2
May 30 20:53:42 linux sshd[27003]: Received disconnect from 10.0.0.1: 2: disconnecte...続きを読む

Aベストアンサー

出来なくはないです。
たとえば実行時刻が 6/2 08:20 だとすると、
grep "^Jun 2 08:1[5-9]" とすれば実行できます。
雑プロ(一時的に統計を取りたいなどの理由でその場限りのプログラムを書くこと)ではこれでいいのではないでしょうか。

ただし、以下の点があるため、運用ベースではお勧めできません。
● シェル上での日付プログラミングを見たことがありますが、月や年・うるう年の処理を全部しなくてはいけない。
● どういう要件で5分としているのかわかりませんが(cronで5分単位で実行するのでしょうか)、5分が10分に変更しようとした場合、さらにテストが必要。

ほかの質問にもありましたが、そういう場合はログ監視ツールを使用してください。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング