Skip to content

Instantly share code, notes, and snippets.

@colrichie
Last active March 18, 2025 14:08
Show Gist options
  • Save colrichie/4bc09d5e42dafaf1194c69deaab7610b to your computer and use it in GitHub Desktop.
Save colrichie/4bc09d5e42dafaf1194c69deaab7610b to your computer and use it in GitHub Desktop.
Punctual AWK
#!/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 );
}
'
#!/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