「Hagi utils」の版間の差分

提供: Wikinote
移動: 案内検索
 
(同じ利用者による、間の24版が非表示)
行1: 行1:
【秘密】(笑)
 
 
 
ちょっとしたコマンドやライブラリを自宅と会社で同期するためのページ。
 
ちょっとしたコマンドやライブラリを自宅と会社で同期するためのページ。
学生時代に作ってたヤツは今じゃ全然使い物にならない…。
 
  
 
== C 言語==
 
== C 言語==
  
=== printb() 関数 ===
+
== gawk スクリプト ==
整数を 2 進数で表示する関数。
+
 
#include <stdio.h>
+
== bash スクリプト ==
 +
 
 +
=== split_strace.sh ===
 +
strace -f で採取したログをプロセス毎に分割する。
 +
 
 +
ソースコード <toggledisplay>
 +
#!/bin/bash
 
   
 
   
  void printb(unsigned num) {
+
  if [ $# -ne 2 ]; then
     int i;
+
     printf "Usage: %s LOGFILE TARGET_DIR\n" "$0"
     for (i = 31; i >= 0; i--) {
+
     exit 1
        putchar(((num >> i) & 1) + '0');
+
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
 
   
 
   
  void printb64(unsigned long long num) {
+
  echo collecting PIDs...
     int i;
+
PIDS=$(awk '{print $1}' "$1" | sort | uniq | sort -n)
     for (i = 63; i >= 0; i--) {
+
echo PIDS=$PIDS
         putchar(((num >> i) & 1) + '0');
+
    }
+
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."
 
  }
 
  }
実行例
+
  [hagio@lab ~]$ printb 1234567890
+
  ### main ###
  01001001100101100000001011010010
+
while getopts "i:ndh" opt; do
  [hagio@lab ~]$ printb -1
+
    case $opt in
  11111111111111111111111111111111
+
        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>