Last active
March 18, 2025 14:08
-
-
Save colrichie/4bc09d5e42dafaf1194c69deaab7610b to your computer and use it in GitHub Desktop.
Punctual AWK
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
PATH="$(pwd):$PATH" | |
ctrlfile="./ctrlfile" | |
if ! [ -e "$ctrlfile" ]; then | |
mkfifo "$ctrlfile" || { echo "Cannot make the control file" 2>&1; exit 1; } | |
elif [ -c "$ctrlfile" ] || [ -p "$ctrlfile" ]; then | |
: | |
else | |
echo "Another file having the same name exists" 2>&1; exit 1; | |
fi | |
awk -v ctrlfile="$ctrlfile" ' | |
BEGIN { | |
# 0) 現在時刻取得関数の使用のための初期設定 | |
init_gettime("3I", ctrlfile); | |
print "LOG: init_gettime() is done" | |
# 1) 何か処理をする.......................... | |
print "LOG: start sleeping for 0.5 second" | |
system("sleep 0.5"); | |
print "LOG: finish sleeping" | |
# 2) 現在時刻を表示する | |
print "LOG: Current-time is " gettime(); | |
# 3) 何か処理をする.......................... | |
print "LOG: start sleeping for 1.5 seconds" | |
system("sleep 1.5"); | |
print "LOG: finish sleeping" | |
# 4) 現在時刻を表示する | |
print "LOG: Current-time is " gettime(); | |
# 5) 何か処理をする.......................... | |
print "LOG: start sleeping for 1.0 second" | |
system("sleep 1"); | |
print "LOG: finish sleeping" | |
# 6) 現在時刻を表示する | |
print "LOG: Current-time is " gettime(); | |
# 7) 用が済んだら現在時刻取得関数のリソースを解放する | |
# (AWKは実行したコマンドが終了するまで待機してしまうから) | |
release_gettime(); | |
print "LOG: release_gettime() is done" | |
# 8) 終了 | |
print "LOG: Exit \"pawk\" (Possible only if you called the func.)"; | |
exit(0); | |
} | |
# === 現在時刻取得関数の初期化 ===================================== | |
# [機能] 現在時刻取得関数(gettime)を取得するための準備を行う関数 | |
# [引数] mode ... モード文字列 | |
# * "0","3","6","9"のいずれかの文字を含めると | |
# 取得できる時刻の小数点以下の精度を設定可(デフォルト:0) | |
# * "c","e","z","Z","I"のいずれかの文字を含めると | |
# 取得できる時刻のフォーマットを設定可(デフォルト:c) | |
# "c"...カレンダー時刻(YYYYMMDDhhmmzz) | |
# "e"...UNIXエポック秒(n) | |
# "z"...この関数実行時からの経過秒 | |
# "Z"...上記と同じ | |
# "I"...ISO 8601(拡張形式) | |
# fifoname 内部で使ってよい名前付きパイプのファイル名 | |
# [戻値] なし | |
# [注意] 次のリソースを使用するので、それらをいじらないこと。 | |
# * グローバル変数 | |
# __gettime_cmd | |
# __gettime_fifo | |
# * ファイル | |
# 第1引数"mode"で指定した名前のファイル | |
# | |
function init_gettime(mode, fifoname) { | |
if (! match(mode,/^([0369cezZI]|[0369][cezZI]|[cezZI][0369])$/)) { | |
mode = "0c" | |
} | |
__gettime_fifo= fifoname; | |
gsub(/[] "#$&'"'"'()*;<>?\\`{|}[]/,"\\\\&",fifoname); | |
__gettime_cmd = "linets -1" mode " " fifoname; | |
__gettime_cmd | getline mode; | |
} | |
# === 現在時刻取得関数 ============================================= | |
# [機能] 現在時刻を取得する | |
# [引数] なし | |
# [戻値] 現在時刻文字列 | |
# | |
function gettime(dummy) { | |
print 1 > __gettime_fifo; fflush(); | |
__gettime_cmd | getline dummy; | |
return substr(dummy,1,index(dummy," ")-1); | |
} | |
# === 現在時刻取得関数の終了 ====================================== | |
# [機能] 現在時刻取得関数(gettime)の使用を終え、リソースを解放する | |
# [引数] なし | |
# [戻値] なし | |
function release_gettime() { | |
close(__gettime_fifo); | |
close(__gettime_cmd ); | |
} | |
' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
PATH="$(pwd):$PATH" | |
ctrlfile="./ctrlfile" | |
if ! [ -e "$ctrlfile" ]; then | |
mkfifo "$ctrlfile" || { echo "Cannot make the control file" 2>&1; exit 1; } | |
elif [ -c "$ctrlfile" ] || [ -p "$ctrlfile" ]; then | |
: | |
else | |
echo "Another file having the same name exists" 2>&1; exit 1; | |
fi | |
awk -v ctrlfile="$ctrlfile" ' | |
BEGIN { | |
# 0) 現在時刻取得関数の使用のための初期設定 | |
init_waitill(ctrlfile); | |
print "LOG: init_waitill() is done, timer is set to 0." | |
# 1) 何か処理をする.......................... | |
print "LOG: do some work with 0.3 seconds"; | |
system("sleep 0.3"); | |
# 2) 時刻が2秒になるまで待機 | |
waitill(2); | |
# 3) 再び何か処理をする.......................... | |
print "LOG: do some work with 0.5 seconds"; | |
system("sleep 0.5"); | |
# 4) 時刻が4秒になるまで待機 | |
waitill(4); | |
# 5) 再び何か処理をする.......................... | |
print "LOG: do some work with 0.8 seconds"; | |
system("sleep 0.8"); | |
# 6) 時刻が6秒になるまで待機 | |
waitill(6); | |
# 7) 用が済んだら待機関数のリソースを解放する | |
# (AWKは実行したコマンドが終了するまで待機してしまうから) | |
release_waitill(); | |
print "LOG: release_waitill() is done" | |
# 8) 終了 | |
print "LOG: Exit \"pawk_sleep\" (Possible only if you called the func.)"; | |
exit(0); | |
} | |
# === 待機関数の初期化 ============================================= | |
# [機能] 待機関数(waitill)利用のための準備をし、内部時計を0にする | |
# [引数] fifoname ... 内部で使ってよい名前付きパイプのファイル名 | |
# [戻値] なし | |
# [注意] 次のリソースを使用するので、それらをいじらないこと。 | |
# * グローバル変数 | |
# __waitill_cmd | |
# __waitill_fifo | |
# * ファイル | |
# 第1引数"fifoname"で指定した名前のファイル | |
# | |
function init_waitill(fifoname) { | |
__waitill_fifo= fifoname; | |
gsub(/[] "#$&'"'"'()*;<>?\\`{|}[]/,"\\\\&",fifoname); | |
__waitill_cmd = "tscat -1z " fifoname; | |
__waitill_cmd | getline fifoname; | |
} | |
# === 待機関数 ===================================================== | |
# [機能] 指定した時刻まで待機する | |
# [引数] 復帰する時刻(init_waitill()実行時からの秒数) | |
# [戻値] なし | |
# | |
function waitill(time) { | |
print time " " > __waitill_fifo; fflush(); | |
__waitill_cmd | getline time; | |
} | |
# === 待機関数の終了 =============================================== | |
# [機能] 待機関数(waitill)の使用を終え、リソースを解放する | |
# [引数] なし | |
# [戻値] なし | |
function release_waitill() { | |
close(__waitill_fifo); | |
close(__waitill_cmd ); | |
} | |
' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment