ablog

不器用で落着きのない技術者のメモ

bash

複数のSQLが記述されたテキストファイルを1SQL=1ファイルに分割する bash スクリプト

以下のような1ファイルにファイル名とSQLテキストがまとめて書かれているファイルを filename1.sql、filename2.sql、filename3.sql のように別々のファイルに分割して、ファイルの中身に "select * from t1;" のような SQL テキストになるようにする bash ス…

bash の変数展開を使って FQDN のホスト名の部分だけ取得する

bash の変数展開を使って、FQDN のホスト名(最初のドットより前)の部分だけ取得してみたメモ test.sh #!/usr/bin/bash PG_HOST=${PG_HOST:-redshift-cluster-2.foobar.ap-northeast-1.redshift.amazonaws.com} INSTANCE_IDENTIFIER=${PG_HOST%%.*} echo ${…

bash のヒアドキュメントで変数が展開されないようにする

ヒアドキュメントの中でも""で括った文字列リテラルと同様、 変数展開やコマンド置換が行われます。つまり$MY_VARや$(date)と書くといつもと同じように展開されます。これを抑止する(=''で括ったときのように扱う)にはEOSの部分を下記のようにクォートします…

bash で環境変数にセットせずにコマンドに渡す

bash で環境変数にセット(export)せずにコマンドに渡したメモ。 PG_CONCURRENCY=1 PG_TRAN=1 SQL_SCRIPT=sql/pg_database.sql ./redshift_exec_query.sh & 参考 bashで環境変数をexportせずにシェルスクリプトを実行したい場合はコマンドの前に記述するこ…

bash でシェル変数のデフォルト値をセッツ

bash でシェル変数のデフォルト値をセッツしたメモ。 PG_USER=${PG_USER:-awsuser} PG_DB=${PG_DB:-dev} PG_PORT=${PG_PORT:-5439} 参考 Bash: 変数のデフォルト値の定義は`${変数名:-初期値}`でやる - Qiita

bash で YYYYMMDD な名前のファイルを作成する

ファイルを作成する for i in {0..364} do YYMMDD=$(date --date "20180101 $i days" +%Y%m%d) echo ${YYMMDD} > table01_${YYMMDD}.txt done 作成したファイルを確認する $ ls |head table01_20180101.txt table01_20180102.txt table01_20180103.txt table…

less で - や + で始まるファイルを開く

- や + で始まるファイルを開こうとすると以下のようにエラーになるので、 $ less +ASM1_ora_19821.trc Missing filename ("less --help" for help) 以下のように -- とオプションをつけるとよい。 $ less -- +ASM1_ora_19821.trc 参考 less(1) - Linux manu…

SQL*Plus実行結果をシェル変数に格納する方法

SQL*Plus にヒアドキュメントで SQL を渡し、全体をバッククオート(`)で囲めばよい。"$"などはエスケープする必要がある。 $ TRACE_DIR=`sqlplus -s <

bash のプロセス置換を使ってみた

bash-3.2$ for i in {1..10} do touch $i.pc touch $i.c done bash-3.2$ touch 0.pc bash-3.2$ touch 11.c bash-3.2$ ls 0.pc 1.c 1.pc 10.c 10.pc 11.c 2.c 2.pc 3.c 3.pc 4.c 4.pc 5.c 5.pc 6.c 6.pc 7.c 7.pc 8.c 8.pc 9.c 9.pc bash-3.2$ sdiff -s <(fin…

「jobs -l」実行したときの「+」とか「-」ってなんだろ?

-bash-3.00$ jobs -l [1] 7328 Running tail -f a & [2]- 7339 Running perl -e 'while(1) {}' & [3]+ 7535 Running tail -f a & ↑の「-」とか「+」とかは何を意味するんだろう?手元の Solaris 10 でちょっと確認してみた。 -bash-3.00$ cat /etc/release O…

Oracle Database をインストール前に設定する /etc/security/limits.conf と /etc/profile について

Oracle Database や Grid Infrastructure の製品マニュアル(Oracle Databaseのインストール前の作業、クラスタ用Oracle Grid Infrastructureの拡張インストール前の作業)に /etc/security/limits.conf と /etc/profile を以下のように設定するよう書かれて…

OS から見た Oracle Database on Linux が使用しているメモリサイズを表示するシェルスクリプト

今年の春に作った Oracle Database on Linux が使用しているメモリサイズを表示するシェルスクリプトをとりあえず github に push しました。かなりてきとーなシェルスクリプトです。精査してませんし、改善すべき点もたくさんあると思います。 ソースコード…

find + xargs でx日より前に更新されたファイルを削除する前に削除対象ファイルのタイムスタンプを確認する

90日よりも前に更新されたファイルを削除しようとして、 $ find . -type f -mtime +90 -print0|xargs -0 rm ↑を実行しようかと。。。 ただ、本当に大丈夫かなということで、 $ find . -type f -mtime +90 -print0|xargs -n1 -0 stat --format=%y|sort -n|per…

いんぽり監視

$ while :; do pgrep impdp || echo fin|mail -s 'fin' ablog_at_ezweb.ne.jp ; sleep 60; done & $ disown %1 追記: いんぽり終わったら1分間隔であほみたいにメールが飛んできて、眠かったけど起きれましたw

bash でビルトインコマンドを調べる

bash でビルトインコマンドがあるかどうか調べるには help を使えば良い。 $ which source /usr/bin/which: no source in (/usr/lib64/qt-3.3/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin) $ help source source: source filename [arguments] Read…

2つのスキーマのテーブル・インデックスの差異を調べる使い捨てシェルスクリプト

#!/bin/bash export LANG=C export NLS_LANG=American_America.JA16SJISTILDE cd $(cd $(dirname $0);pwd) sqlplus -s system/manager@192.168.1.10:1521/orcl <

bash の if 文の「 [ ] 」と「 [ [ ] ] 」の違い

「[ 」は外部コマンド。/usr/bin 以下にある実行可能ファイル。「 [ 」がコマンド本体で「 ] 」はパラメータ。 「 [ 」の直後にスペースがないとエラーになるのはそのため。 $ which [ /usr/bin/[ $ ls -l /usr/bin/[ -rwxr-xr-x 1 root root 31048 Sep 4 07…

ログアウトしても scp による転送が終了しないようにする方法

テスト用に100Mのファイルを作成する。 $ dd if=/dev/zero of=dummy bs=1024k count=100 $ ls -lh ... -rw-rw-r-- 1 neo neo 100M 2月 12 13:58 dummy 頭に nohup をつけて scp を実行する。 $ nohup scp dummy oracle@192.168.153.17:~/ nohup: appending o…

実行時に自分自身を書き換えるシェルスクリプト

$ cat hoge.sh #!/bin/bash cat <<EOF > $0 #!/bin/bash exit 1 EOF exit 0 $ ./hoge.sh $ echo $? 0 $ ./hoge.sh $ echo $? 1 $ cat hoge.sh #!/bin/bash exit 1 初回実行時は戻り値が 0 だが、2 回目以降は戻り値が 1 になる。</eof>

bash でファイルのタイムスタンプを比較するロジック

compare.sh #!/bin/bash # a and b don't exist if [[ ! -f a && ! -f b ]];then echo a and b don\'t exist # b doesn't exist elif [[ -f a && ! -f b ]];then echo b doesn\'t exist # a doesn't exist elif [[ ! -f a && -f b ]];then echo a doesn\'t e…

楽々 import シェルスクリプトを作った

来る日も来る日も、Oracle Database の export ユーティリティーでとった dump ファイルを別の環境に import。。。 ユーザを drop して create して、import。ただ、気をつけないと drop した後に、あれ? このユーザはどんなシステム権限を持ってたっけ?オ…

bash でファイルの最終更新時刻が現在と同じ時間か調べる方法

$ touch a $ touch b -t `date -d "-1 days" '+%Y%m%d%H%M'` $ ls -l total 0 -rw-r--r-- 1 oracle oinstall 0 Feb 3 16:10 a -rw-r--r-- 1 oracle oinstall 0 Feb 2 16:10 b $ ls|while read line do if [ "`stat --print=%y $line|perl -ple 's/([0-9\-:\s…

Linux でファイルの更新日時のみを取得する方法

$ touch a $ stat --print=%y a 2010-02-03 15:44:12.000000000 +0900

shUnit2 を使ってシェルスクリプトのユニットテストをやってみた

シェルスクリプトのユニットテストフレームワーク "shUnit2" を使ってみた - ablog のつづき。 実際に自分で作った bash スクリプトのユニットテストを実行してみた。最初のディレクトリ構成はこんなの。 $ su - oracle $ cd /home/oracle/scripts $ tree -p…

スキーマ単位で export する単純な bash スクリプト

Oracle Database のデータをスキーマ単位で export する単純な bash スクリプトを作ってみた。 yoheia/ora_exp_dmp.sh at master · yoheia/yoheia · GitHub #!/bin/bash export LANG=C export NLS_LANG=American_America.JA16SJISTILDE BASE_DIR=$(cd $(dirn…

シェルスクリプトのユニットテストフレームワーク "shUnit2" を使ってみた

ないだろうと思いながらぐぐってみたら、 shUnit2 is a xUnit unit test framework for Bourne based shell scripts, and it is designed to work in a similar manner to JUnit, PyUnit, etc. If you have ever had the desire to write a unit test for a …

bash で テスト用に YYYY-MM-DD を含むファイル名でファイルを作成し、タイムスタンプもその日付にする

$ for i in {1..365}; do touch -t `date -d "-$i days" '+%Y%m%d%H%M'` hoge-`date -d "-$i days" '+%Y-%m-%d-%H%M%S'`.log; done $ ls -ltr|head -10 total 0 -rw-r--r-- 1 oracle oinstall 0 Jan 28 2009 hoge-2009-01-28-173905.log -rw-r--r-- 1 oracle…

bash で ファイルのタイムスタンプを比較する

$ ls -l -rw-r--r-- 1 oracle oinstall 0 1月 13 18:45 a -rw-r--r-- 1 oracle oinstall 0 1月 13 18:46 b $ if [[ a -ne b ]]; then > echo a is newer than b. > else > echo a is older than b. > fi a is older than b. 参考 http://www.geocities.jp/ge…

bash でループの中でループの外のシェル変数の値を変更する

$ a=1 $ ls|while read LINE > do > a=2 > done $ echo $a 1 と、ループの中で変数 a の値を変更してもループの外の変数 a の値は変わらない。 forやwhile文などのリダイレクト処理はカレントシェルではなく、 サブシェルで実行される http://lagendra.s.kan…

保持期限を過ぎたファイルを削除するシェルスクリプト

保持期限を過ぎたファイルをタイムスタンプではなく、ファイル名に含まれる日付から判断して削除するシェルスクリプトを bash で書いてみた。 delete.sh #!/bin/bash EXPIRE_DATE=`date -d '-31 days' '+%Y%m%d'` find ./log -name "*.log"|while read LINE …