「Hagi utils」の版間の差分
提供: Wikinote
細 (→printb() 関数) |
細 |
||
(同じ利用者による、間の23版が非表示) | |||
行1: | 行1: | ||
− | |||
− | |||
ちょっとしたコマンドやライブラリを自宅と会社で同期するためのページ。 | ちょっとしたコマンドやライブラリを自宅と会社で同期するためのページ。 | ||
− | |||
== C 言語== | == C 言語== | ||
− | === | + | == gawk スクリプト == |
− | + | ||
− | + | == bash スクリプト == | |
+ | |||
+ | === split_strace.sh === | ||
+ | strace -f で採取したログをプロセス毎に分割する。 | ||
+ | |||
+ | ソースコード <toggledisplay> | ||
+ | #!/bin/bash | ||
− | + | if [ $# -ne 2 ]; then | |
− | + | printf "Usage: %s LOGFILE TARGET_DIR\n" "$0" | |
− | + | exit 1 | |
− | + | elif [ ! -e "$2" ]; then | |
− | + | mkdir -p "$2" | |
− | + | echo INFO: directory \'$2\' is made. | |
+ | elif [ ! -d "$2" ]; then | ||
+ | echo ERROR: \'$2\' is NOT directory. | ||
+ | exit 1 | ||
+ | fi | ||
− | + | echo collecting PIDs... | |
− | + | PIDS=$(awk '{print $1}' "$1" | sort | uniq | sort -n) | |
− | + | echo PIDS=$PIDS | |
− | + | ||
− | + | for PID in $PIDS; do | |
+ | echo do grep ^$PID $1 | ||
+ | grep ^$PID "$1" > "$2/$PID" | ||
+ | done | ||
+ | echo done. | ||
+ | </toggledisplay> | ||
+ | |||
+ | === difftime === | ||
+ | 2 つの日時の差を様々な形式で出力する。 | ||
+ | |||
+ | ソースコード <toggledisplay> | ||
+ | #!/bin/bash | ||
+ | if [ $# -lt 2 ]; then | ||
+ | echo "Usage: difftime DATE1 DATE2" | ||
+ | exit 0 | ||
+ | fi | ||
+ | START=$(date +%s -d "$1") | ||
+ | END=$(date +%s -d "$2") | ||
+ | SEC=$((END - START)) | ||
+ | MIN=$(echo $SEC / 60 | bc -l) | ||
+ | HOUR=$(echo $SEC / 3600 | bc -l) | ||
+ | DAY=$(echo $SEC / 86400 | bc -l) | ||
+ | INT_DAY=$(echo $SEC / 86400 | bc) | ||
+ | REM_HOUR=$(echo $SEC % 86400 | bc) | ||
+ | INT_HOUR=$(echo $REM_HOUR / 3600 | bc) | ||
+ | REM_MIN=$(echo $REM_HOUR % 3600 | bc) | ||
+ | INT_MIN=$(echo $REM_MIN / 60 | bc) | ||
+ | INT_SEC=$(echo $REM_MIN % 60 | bc) | ||
+ | |||
+ | echo "$2 - $1" | ||
+ | echo "= $END - $START" | ||
+ | echo "= $SEC seconds" | ||
+ | echo "= $MIN minites" | ||
+ | echo "= $HOUR hours" | ||
+ | echo "= $DAY days" | ||
+ | echo "= $INT_DAY days $INT_HOUR hours $INT_MIN minutes $INT_SEC seconds" | ||
+ | </toggledisplay> | ||
+ | |||
+ | 実行例:もういくつ寝るとお正月 | ||
+ | $ difftime "$(LANG=C date)" '1/1 0:0:0 2011' | ||
+ | 1/1 0:0:0 2011 - Wed Oct 13 22:06:59 JST 2010 | ||
+ | = 1293807600 - 1286975219 | ||
+ | = 6832381 seconds | ||
+ | = 113873.01666666666666666666 minites | ||
+ | = 1897.88361111111111111111 hours | ||
+ | = 79.07848379629629629629 days | ||
+ | = 79 days 1 hours 53 minutes 1 seconds | ||
+ | |||
+ | === cgrep === | ||
+ | パターンが含まれる関数名を表示するスクリプト。ほとんど awk ですけど。 | ||
+ | |||
+ | ソースコード <toggledisplay> | ||
+ | #!/bin/bash | ||
+ | IFS=$'\n' | ||
+ | RESULT=$(grep -nH $@) | ||
+ | for l in $RESULT; do | ||
+ | FILE=$(echo "$l" | cut -d: -f 1) | ||
+ | LINE=$(echo "$l" | cut -d: -f 2) | ||
+ | gawk -v line=$LINE -v file=$FILE ' | ||
+ | NR < line && /^\w/ && !/:/ { | ||
+ | cand = $0 | ||
+ | cand_line = NR | ||
+ | } | ||
+ | NR == line { | ||
+ | if ($0 ~ /^\w/) { | ||
+ | print file ":" line ":" | ||
+ | } else { | ||
+ | print file ":" cand_line ":" | ||
+ | print cand | ||
+ | } | ||
+ | gsub("\t", " ") | ||
+ | print $0 | ||
+ | exit | ||
+ | } | ||
+ | ' $FILE | ||
+ | done | ||
+ | </toggledisplay> | ||
+ | |||
+ | === plog コマンド === | ||
+ | プログラムを定期的に実行し、その出力にタイムスタンプを付与するシェルスクリプト。 | ||
+ | |||
+ | Usage: | ||
+ | plog [-d] [-i INTERVAL] [-n] command | ||
+ | plog -h | ||
+ | Options: | ||
+ | -d 時刻に加えて日付を付加する。 | ||
+ | -h 使い方を表示する。 | ||
+ | -i INTERVAL コマンドを実行する間隔(秒)。デフォルトでは 1 秒。 | ||
+ | -n 時刻等を付加せず、コマンドの実行結果のみを出力する。 | ||
+ | |||
+ | ソースコード <toggledisplay> | ||
+ | #!/bin/bash | ||
+ | ### parameters ### | ||
+ | INTERVAL=1 | ||
+ | PRINT_TIME=1 | ||
+ | PRINT_DATE=0 | ||
+ | ### constants ### | ||
+ | CMD_NAME=$(basename $0) | ||
+ | DEFAULT_SCRIPT='{ print strftime("%T"), $0 }' | ||
+ | ADDDATE_SCRIPT='{ print strftime("%F %T"), $0 }' | ||
+ | ### flags & variables ### | ||
+ | GETOPT_ERR=0 | ||
+ | |||
+ | ### functions ### | ||
+ | function usage() { | ||
+ | echo "Usage:" | ||
+ | echo " $CMD_NAME [-d] [-i INTERVAL] [-n] command" | ||
+ | echo " $CMD_NAME -h" | ||
+ | echo "Options:" | ||
+ | echo " -d Print date besides time." | ||
+ | echo " -h Print this help." | ||
+ | echo " -i INTERVAL Specify the interval between executions. (seconds) Default is 1 s." | ||
+ | echo " -n Do not print time or date. Print command output only." | ||
} | } | ||
− | + | ||
− | + | ### main ### | |
− | + | while getopts "i:ndh" opt; do | |
− | [ | + | case $opt in |
− | + | i) INTERVAL=$OPTARG;; | |
+ | n) PRINT_TIME=0;; | ||
+ | d) PRINT_DATE=1;; | ||
+ | h) usage; exit 0;; | ||
+ | ?) GETOPT_ERR=1;; | ||
+ | esac | ||
+ | done | ||
+ | shift $(( $OPTIND - 1 )) | ||
+ | |||
+ | if [ $GETOPT_ERR -eq 1 -o $# -eq 0 ]; then | ||
+ | usage | ||
+ | exit 0 | ||
+ | fi | ||
+ | |||
+ | CMD=$@ | ||
+ | while : ; do | ||
+ | if [ $PRINT_TIME -eq 0 ]; then | ||
+ | $CMD | ||
+ | elif [ $PRINT_DATE -eq 1 ]; then | ||
+ | $CMD | gawk "$ADDDATE_SCRIPT" | ||
+ | else | ||
+ | $CMD | gawk "$DEFAULT_SCRIPT" | ||
+ | fi | ||
+ | sleep $INTERVAL | ||
+ | done | ||
+ | </toggledisplay> | ||
+ | |||
+ | == Python スクリプト == | ||
+ | |||
+ | === netspeed.py === | ||
+ | ネットワークインタフェースの転送量や転送レートを出力する。 | ||
+ | |||
+ | [http://hagio.org/pystat/netspeed.py ソースコード] | ||
+ | |||
+ | $ ./netspeed.py -h | ||
+ | Usage: netspeed.py [-dhkprt] [-o FILE] [INTERVAL] | ||
+ | |||
+ | Options: | ||
+ | -d debug mode | ||
+ | -h show this help | ||
+ | -k show output in KB | ||
+ | -o output to FILE | ||
+ | -p show packets | ||
+ | -r show output in transfer rate | ||
+ | -t show output with timestamp | ||
+ | |||
+ | 実行例 <toggledisplay> | ||
+ | $ ./netspeed.py -pt 2 | ||
+ | 2011-05-19 22:31:00 Device: rx bytes tx bytes rx packets tx packets | ||
+ | 2011-05-19 22:31:00 sit0: 0.00 0.00 0.00 0.00 | ||
+ | 2011-05-19 22:31:00 lo: 0.00 0.00 0.00 0.00 | ||
+ | 2011-05-19 22:31:00 eth1: 0.00 0.00 0.00 0.00 | ||
+ | 2011-05-19 22:31:00 eth0: 852.00 972.00 6.00 5.00 | ||
+ | |||
+ | 2011-05-19 22:31:02 Device: rx bytes tx bytes rx packets tx packets | ||
+ | 2011-05-19 22:31:02 sit0: 0.00 0.00 0.00 0.00 | ||
+ | 2011-05-19 22:31:02 lo: 0.00 0.00 0.00 0.00 | ||
+ | 2011-05-19 22:31:02 eth1: 0.00 0.00 0.00 0.00 | ||
+ | 2011-05-19 22:31:02 eth0: 194.00 658.00 3.00 3.00 | ||
+ | |||
+ | 2011-05-19 22:31:04 Device: rx bytes tx bytes rx packets tx packets | ||
+ | 2011-05-19 22:31:04 sit0: 0.00 0.00 0.00 0.00 | ||
+ | 2011-05-19 22:31:04 lo: 0.00 0.00 0.00 0.00 | ||
+ | 2011-05-19 22:31:04 eth1: 0.00 0.00 0.00 0.00 | ||
+ | 2011-05-19 22:31:04 eth0: 1271.00 27798.00 16.00 25.00 | ||
+ | </toggledisplay> |
2011年5月28日 (土) 12:25時点における最新版
ちょっとしたコマンドやライブラリを自宅と会社で同期するためのページ。
目次
C 言語
gawk スクリプト
bash スクリプト
split_strace.sh
strace -f で採取したログをプロセス毎に分割する。
ソースコード <toggledisplay>
#!/bin/bash if [ $# -ne 2 ]; then printf "Usage: %s LOGFILE TARGET_DIR\n" "$0" exit 1 elif [ ! -e "$2" ]; then mkdir -p "$2" echo INFO: directory \'$2\' is made. elif [ ! -d "$2" ]; then echo ERROR: \'$2\' is NOT directory. exit 1 fi echo collecting PIDs... PIDS=$(awk '{print $1}' "$1" | sort | uniq | sort -n) echo PIDS=$PIDS for PID in $PIDS; do echo do grep ^$PID $1 grep ^$PID "$1" > "$2/$PID" done echo done.
</toggledisplay>
difftime
2 つの日時の差を様々な形式で出力する。
ソースコード <toggledisplay>
#!/bin/bash if [ $# -lt 2 ]; then echo "Usage: difftime DATE1 DATE2" exit 0 fi START=$(date +%s -d "$1") END=$(date +%s -d "$2") SEC=$((END - START)) MIN=$(echo $SEC / 60 | bc -l) HOUR=$(echo $SEC / 3600 | bc -l) DAY=$(echo $SEC / 86400 | bc -l) INT_DAY=$(echo $SEC / 86400 | bc) REM_HOUR=$(echo $SEC % 86400 | bc) INT_HOUR=$(echo $REM_HOUR / 3600 | bc) REM_MIN=$(echo $REM_HOUR % 3600 | bc) INT_MIN=$(echo $REM_MIN / 60 | bc) INT_SEC=$(echo $REM_MIN % 60 | bc) echo "$2 - $1" echo "= $END - $START" echo "= $SEC seconds" echo "= $MIN minites" echo "= $HOUR hours" echo "= $DAY days" echo "= $INT_DAY days $INT_HOUR hours $INT_MIN minutes $INT_SEC seconds"
</toggledisplay>
実行例:もういくつ寝るとお正月
$ difftime "$(LANG=C date)" '1/1 0:0:0 2011' 1/1 0:0:0 2011 - Wed Oct 13 22:06:59 JST 2010 = 1293807600 - 1286975219 = 6832381 seconds = 113873.01666666666666666666 minites = 1897.88361111111111111111 hours = 79.07848379629629629629 days = 79 days 1 hours 53 minutes 1 seconds
cgrep
パターンが含まれる関数名を表示するスクリプト。ほとんど awk ですけど。
ソースコード <toggledisplay>
#!/bin/bash IFS=$'\n' RESULT=$(grep -nH $@) for l in $RESULT; do FILE=$(echo "$l" | cut -d: -f 1) LINE=$(echo "$l" | cut -d: -f 2) gawk -v line=$LINE -v file=$FILE ' NR < line && /^\w/ && !/:/ { cand = $0 cand_line = NR } NR == line { if ($0 ~ /^\w/) { print file ":" line ":" } else { print file ":" cand_line ":" print cand } gsub("\t", " ") print $0 exit } ' $FILE done
</toggledisplay>
plog コマンド
プログラムを定期的に実行し、その出力にタイムスタンプを付与するシェルスクリプト。
Usage: plog [-d] [-i INTERVAL] [-n] command plog -h Options: -d 時刻に加えて日付を付加する。 -h 使い方を表示する。 -i INTERVAL コマンドを実行する間隔(秒)。デフォルトでは 1 秒。 -n 時刻等を付加せず、コマンドの実行結果のみを出力する。
ソースコード <toggledisplay>
#!/bin/bash ### parameters ### INTERVAL=1 PRINT_TIME=1 PRINT_DATE=0 ### constants ### CMD_NAME=$(basename $0) DEFAULT_SCRIPT='{ print strftime("%T"), $0 }' ADDDATE_SCRIPT='{ print strftime("%F %T"), $0 }' ### flags & variables ### GETOPT_ERR=0 ### functions ### function usage() { echo "Usage:" echo " $CMD_NAME [-d] [-i INTERVAL] [-n] command" echo " $CMD_NAME -h" echo "Options:" echo " -d Print date besides time." echo " -h Print this help." echo " -i INTERVAL Specify the interval between executions. (seconds) Default is 1 s." echo " -n Do not print time or date. Print command output only." } ### main ### while getopts "i:ndh" opt; do case $opt in i) INTERVAL=$OPTARG;; n) PRINT_TIME=0;; d) PRINT_DATE=1;; h) usage; exit 0;; ?) GETOPT_ERR=1;; esac done shift $(( $OPTIND - 1 )) if [ $GETOPT_ERR -eq 1 -o $# -eq 0 ]; then usage exit 0 fi CMD=$@ while : ; do if [ $PRINT_TIME -eq 0 ]; then $CMD elif [ $PRINT_DATE -eq 1 ]; then $CMD | gawk "$ADDDATE_SCRIPT" else $CMD | gawk "$DEFAULT_SCRIPT" fi sleep $INTERVAL done
</toggledisplay>
Python スクリプト
netspeed.py
ネットワークインタフェースの転送量や転送レートを出力する。
$ ./netspeed.py -h Usage: netspeed.py [-dhkprt] [-o FILE] [INTERVAL] Options: -d debug mode -h show this help -k show output in KB -o output to FILE -p show packets -r show output in transfer rate -t show output with timestamp
実行例 <toggledisplay>
$ ./netspeed.py -pt 2 2011-05-19 22:31:00 Device: rx bytes tx bytes rx packets tx packets 2011-05-19 22:31:00 sit0: 0.00 0.00 0.00 0.00 2011-05-19 22:31:00 lo: 0.00 0.00 0.00 0.00 2011-05-19 22:31:00 eth1: 0.00 0.00 0.00 0.00 2011-05-19 22:31:00 eth0: 852.00 972.00 6.00 5.00 2011-05-19 22:31:02 Device: rx bytes tx bytes rx packets tx packets 2011-05-19 22:31:02 sit0: 0.00 0.00 0.00 0.00 2011-05-19 22:31:02 lo: 0.00 0.00 0.00 0.00 2011-05-19 22:31:02 eth1: 0.00 0.00 0.00 0.00 2011-05-19 22:31:02 eth0: 194.00 658.00 3.00 3.00 2011-05-19 22:31:04 Device: rx bytes tx bytes rx packets tx packets 2011-05-19 22:31:04 sit0: 0.00 0.00 0.00 0.00 2011-05-19 22:31:04 lo: 0.00 0.00 0.00 0.00 2011-05-19 22:31:04 eth1: 0.00 0.00 0.00 0.00 2011-05-19 22:31:04 eth0: 1271.00 27798.00 16.00 25.00
</toggledisplay>