Help us understand the problem. What is going on with this article?

本当のワンライナーへの道

以前

私が投稿したスクリプティングテクを使った
テーブルデータを一発でcsvに落とすスクリプト
をご存じだろうか?
ここでは、ヒアドキュメントとパイプを駆使したものである。

これの問題は

実質的中間ファイルを作成してしまうことにあった。
それに、これ自体をスクリプトファイルとする事が、

スクリプトの作業デイレクトリ依存脱却すらできていない。

そこで、これから示すBashの有用機能で脱却してみる。

コマンド入力ファイルとして処理に、

又はコマンドの出力結果ファイルとして処理にあてがえる
<(標準出力処理) , >(標準入力処理)
である。(この正規呼称は敢えて調べていない)

これを使うとメインのコマンドにわたすデータをコマンド中に書きまくれると言う夢のスクリプティングが可能出会った。

では、その一例として以下要件のスクリプトを紹介する。
①圧縮された入力データ logdata.gz
②それを格納するデータベーステーブル DATALOG
③①を解凍(標準出力へ)し②のカラムホーマットにし
④データベース(Oracle)に格納する為のctlファイルをsqlldrに渡す。
※入力LOGのホーマット
yyyy/mm/dd HH:MM:SS ログ文字列
※テーブルcolum構成
年月日時分秒を数値
ログデータの行番号
ログ文字列
※拡張正規表現によるperlでの置換規則列
以下スクリプト中のperl -pe 以後に記載

スクリプト(bash)

直接叩く
#②のテーブル作成
sqlplus user/passwd@sids <<CREATS
create table DATALOG (
datetimes number,
lines number,
datas varchar2(2048)
/
quit;
CREATS

#sqlldrに内に①③④を書くテク
sqlldr user/passwd@sids contlor=<(\
cat <<EOFCTL
load data
append
preserve blanks
into DATALOG
fields terminated by ","
TRAILING NULLCOLS
(
  datetimes,
  lines,
  datas char(2048)
)
EOFCTL
)  \
data=<(\
gunzip -c ./logdata.gz |\
perl -pe 's/^([0-9]{4})\/([0-9]{2})\/([0-9]{2})\s+([0-9]+):([0-9]+):([0-9]+)\s*(.+)$/$1$2$3$4$5$6,$.,$7/g'\
)

以上。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away