BashスクリプトからSQLiteを操作する方法(PSコマンドの結果をDB格納してみた)

Bashスクリプトワンライナーから直接SQLiteを操作する方法です。せっかくなのでPSコマンドで出力したプロセスの一覧をDBに格納するところまでやってみました。

Bashからsqliteを操作する方法

DB作成方法。

echo ".open db_name" | sqlite3

SQL文投入はこんな感じ。

sqlite3 db_name "SQL文"

Bashスクリプト例(PSコマンドの結果をDBに投入)

後はスクリプトに組み込むだけ。

PSコマンドの結果をDBに取り込んでみました。

#!/bin/bash
if [ $# -ne 1 ];then
  cat <<_EOS_
Usage
  $0 databasefile
_EOS_
exit -1
fi

if [ ! -x $(which sqlite3) ];then
  echo "sqlite3 not found."
  exit -1
fi

cd $(dirname $0)
dbfile=$1

# Create Database
if [ ! -e ${dbfile} ];then
  echo ".open ${dbfile}" | sqlite3
fi

option="-noheader -separator ,"
sqlite="sqlite3 ${option} ${dbfile} "

# Table と Indexの作成
${sqlite} "CREATE TABLE IF NOT EXISTS ps (\
  date_time   TEXT,\
  user        TEXT,\
  pid         INT,\
  cpu_percent REAL,\
  mem_percent REAL,\
  vsz         INT,\
  rss         INT,\
  tt          TEXT,\
  stat        TEXT,\
  started     TEXT,\
  time        INT,\
  command     TEXT\
  );"
${sqlite} "CREATE INDEX IF NOT EXISTS ps_date_time_idx ON ps(date_time)"

# PSコマンドの結果をTableに挿入
date_time=$(date +"%Y-%m-%d %H:%M:%S")
ps auxwwwh | sed -E "s/  */ /g" | while read row
do
  ${sqlite} "INSERT INTO ps VALUES(\
    '${date_time}',\
    '$(echo $row | cut -d" " -f1)',\
    '$(echo $row | cut -d" " -f2)',\
    '$(echo $row | cut -d" " -f3)',\
    '$(echo $row | cut -d" " -f4)',\
    '$(echo $row | cut -d" " -f5)',\
    '$(echo $row | cut -d" " -f6)',\
    '$(echo $row | cut -d" " -f7)',\
    '$(echo $row | cut -d" " -f8)',\
    '$(echo $row | cut -d" " -f9)',\
    '$(echo $row | cut -d" " -f10)',\
    '$(echo $row | cut -d" " -f11-)'\
    );"
done

参考

URL

SQLite Tutorial