2017年11月20日月曜日
2017年11月19日日曜日
SHELL実行高速化
色々やったので忘れないようにメモを残し
★SHELL高速化で分かったこと
- ループの中で通常コマンドを使うと遅くなる。
- bashを使えるならbashの方が速い。
- ファイル検索は ls より find の方が速い。
- ファイル削除は findのコマンドでそのまま削除できる。
- 配列でIndexでループした方が速いときもある。
- IFSコマンドは遅いから、ヒアドキュメントでやったほうがいい。
★文字の置換
#書き方1
args=`echo $args | sed -e "s/変換前/変換後/g"`
#書き方2
args=${args//変換前/変換後}
★ファイルをループさせるとき
#書き方1
for infile in `ls ${infiles}`
#書き方2
for infile in `find ${infiles} -type f -prune -print
#書き方3
for kuwake_index in `seq 0 22`
★文字列の部分抽出
#書き方1
kuwake1=`echo ${文字列} | cut -c 1`
#書き方2
${文字列:0:1}
#書き方3
min=${文字列:14} #--- 長さを省略したら最後まで。
★配列変数の作りかた
file_AtoB=() file_AtoB+=(aaaaaaa:bbbbbb) file_AtoB+=(ccccccc:dddddd)
★ユーザー変えずにコマンド実行するやり方(SQLver)
su - スイッチユーザー -c "sqlplus / @${MAIN_PATH}/実行SQL名.sql"
★関数を並列化して実行する書き方
#--- 関数
function table_backup(){
}
#--- いったん宣言する
export -f table_backup
#--- xargs の後続に呼び出し関数を定義してやる
echo "${tableList}" | xargs -P5 -I% bash -c "table_backup % ${dateTime} ${exportPath} ${backupPath}"
#--- 宣言解除
unset table_backup
★コマンド実行してechoと同じことするやつ
bash -v -c "ls -ltr ${logDir}/"
★ファイル削除の高速化
#書き方1
find ${folder}/${file} -maxdepth 0 -mindepth 0 -type f -print -delete
#書き方2
find ${folder}/${file} -maxdepth 0 -mindepth 0 -type f -print | xargs /bin/rm -f
★ファイル名日本語文字化けするときの対応方法
#---ファイル名の文字コードを変換するときには、convmv
#---CP932 sjisじゃなくてsjisをちょび拡張したものがwindowsの文字コード規格
#---書き方1
convmv -f cp932 -t utf-8 * --notest
#---書き方2
!/bin/sh
for sjis_name in `find .`
do
utf8_name=`echo "${sjis_name}" | iconv -f SJIS -t UTF-8`
if [ "${sjis_name}" != "${utf8_name}" ]; then
mv "${sjis_name}" "${utf8_name}"
fi
done
★SSH接続・リモートコマンド実行
exec setsid ssh $SSH_USER@$SSH_HOST $REMOTE_CMD
★ISCPコマンド発動
iscp /SEIIFS:SEIIFS@IPアドレス:ポート番号/${oldName} //${outPath}/${newName}';replace=on;binary'
★対象サーバーにログインしている人がいないか確認するコマンド
who -u
★HULFTコマンドを実行させるコマンド
#--- hulftのオプション設定
hul_args=$@
#--- hulftコマンド実行
/opt/hulft/bin/utlsend ${hul_args}
★権限付与するときのコマンド
#--- グループ権限付与前確認
cat /etc/group | grep uaa
#--- 権限付与
usermod -G 10, 12101, 12301, 21005, 21001 ${uName}
#--- グループ権限付与後確認
cat /etc/group | grep uaa
change -l ${uName}
change -M 90 ${uName}
change -W 10 ${uName}
change -l ${uName}
★変数に文字列を配列ちっくに持たせる書き方
tableList=`cat << EOS 文字列1 文字列2 EOS`
★日付の書き方
export LOG_DATE=`date "+%Y%m%d" --date '1 day ago'`
★SHELLの中でSQLを実行するやり方
SQLPLUS=${ORACLE_HOME}/bin/sqlplus
RESULT=`${SQLPLUS} -s / << EOF
set pagesize 0;
set head off;
set feed off;
SELECT CH_PROC_YYYY || CH_PROC_MM , CH_PROC_KIND, NM_PROC_CNT FROM TB_BCMHDK069
WHERE CH_PROC_KIND_CD='${1}' AND CH_LATEST_STATE<>'5';
EXIT SQL.SQLCODE;
EOF`
#--- 後は判定分
SQLCODE=$?
if [ ${SQLCODE} -ne 0 ]
★一覧からあるものとないもの一覧を作成する
#--- 両方に存在するファイル名一覧を作成 (-12)#--- 修正前のみに存在するファイル名一覧を作成 (-23)
#--- 修正前のみに存在するファイル名一覧を作成 (-13)
matchList=`bash -c "comm -12 <(cat ${oldFileList}) <(cat ${newFileList})"`
diffList1=`bash -c "comm -23 <(cat ${oldFileList}) <(cat ${newFileList})"`
diffList2=`bash -c "comm -13 <(cat ${oldFileList}) <(cat ${newFileList})"`
★ホスト名を自動で記載するやりかた
tar tvf ${dateS}_`uname -n`.tar.gz
★ファイルの一覧を取得する方法
#書き方1
input_files=`ls ${input_file_path}`
#書き方2
input_files=`find "${DATA_DIR}${APLWORK_OUTPUT}" -maxdepth 1 -mindepth 1 -type f -name ${input_file_name}`
★パイプを使わないでコマンド実行する方法
#書き方1
output_file_name=`echo ${args}|sed 's/.*-o //g'`
#書き方2
output_file_name=`sed <<< ${args} 's/.*-o //g'`
#書き方3
out1=`awk <<< $command 'BEGIN{FS=";"}{print $3}'`
★当日日付
workDate=date '+%Y%m%d'
★JEFコードに変換して改行コードも変換する場合
echo "cat ${in_path}${outfile} | $ICONV_HOME/bin/iconv -a -f utf8 -t jefkana | tr '\045' '\012' > ${out_path}${outfile}"| tee -a ${LOG_FILE}
★IFSコマンドを実行する場合のやり方
set -f
IFS_ORG=$IFS
IFS=';'
set -- ${CmdString}
option=$1
in_file=$2
out_file=$3
#IFS状態修正 ★ infileになってるかもだから注意 あと modeも元に戻しておくこと。
IFS=' '
infiles=$2
outfiles=$1
IFS=$IFS_ORG
set +f
★ORACLE
${ORACLE_HOME}/bin/sqlplus -s / << EOF
WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;
PROMPT ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROMPT DELETE FROM TB_BCMSHY128 WHERE CH_DEMAND_YYYYMM='${demand_yyyy_mm}';
DELETE FROM TB_BCMSHY128 WHERE CH_DEMAND_YYYYMM='${demand_yyyy_mm}';
COMMIT;
exit SQL.SQLCODE
EOF
★ORACLE
#lsは遅いからイラン
target_file_path=$(ls ${filePath})
#-- -pureを設定すること
target_file_path=`find ${DATA_DIR}/work[12]0/output/aplwork[0-9][0-9] -type f -name "IFNBC851_${kuwake_code}.TXT"`
★ORACLE
for kuwake_code in `cat $listFile` do
★ORACLE
find ${files} -maxdepth 1 -mindepth 1 -type f -print -delete || RET_ALL=1
★ORACLE
# $cmd_fileの中で先頭が$job_idに一致する行を取り出します。
commandline=`awk -F':' '{if($1 == job_id) print $2 }' job_id=$job_id $cmd_file`
#--- 修正1(grep あんま速くならないってか awkのほうが速い)
commandline=`LC_ALL=C grep -e "^${job_id}" $cmd_file`
#--- 修正2 あれこっちのが速い
commandline=`LC_ALL=C gawk -F':' -v job_id="${1}" '{if($1 == job_id) print $2 }' $cmd_file`
★ユーザー変えずにコマンド実行するやり方(SQLver)
args=`echo ${CmdString}|sed -e 's/IFNBC[0-9_?A-Z]*.TXT\s//'`
args=`sed <<< ${CmdString} '-e s/IFNBC[0-9_?A-Z]*.TXT\s//'`
★ORACLE
su - skush101 -c "sqlplus -s / " << EOF
set termout off
set lineS 1000
set pageS 1000
set colsep,
set null "@"
set timing off
set verify off
select ch_demand_mm_and_division,ch_result_cd,count(*)
from tb_bctskw037
where ch_demand_mm_and_division in ('${t_demand_mm}1','${t_demand_mm}2')
and ch_demand_YYYYMM = '${t_demand_YYYYMM}'
and ch_latest_state <> '5'
group by ch_demand_mm_and_division,ch_result_cd
order by ch_demand_mm_and_division,ch_result_cd;
EOF
★ORACLE
su - oracle
#--- 設定情報表示実行
sqlplus / as sysda << EOF
#--- アーカイブログ確認コマンドの実行
select name,total_mb,free_mb
from v$asm_diskgroup
order by name;
exit;
EOF
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
#--- エラーがないか確認
cat joblog/*.log | grep -E `(ERROR|error|WARNING|warning)` | more
#改行コードを変換する
nkf ${nkfCode}
#空ファイル一気に作成する
touch $CmdString
#--ループ
for cIndex in `seq 0 ${#A_infile[@]}`
#★★★ファイル名取得して10バイト目から4バイト取得 0はじまり
kuwake=${file##*/:9:4}
#--- なみはあるけど、カレントディレクトリしか見ないんなら -prune だけのほうが速い
find ${cckfile} -type f -prune -print || RET_ALL=1
#---
kuwake=`basename ${file}
#---
LANG=C sed 's/[\x80-\xFF]/●/g' /work/test2.log
send mail to 'aaaa@aaaaa.co.jp' '●●●●●●●●●●●●'
#----
#sqlplus で set コマンド何度も定義したくないから↓で代替できるみたい
local _set_format='set newpage none
set feed off
set line 1000
set trims on'
#---
ls -cl -c つけると作成日付 通常は更新日付
#----
#からの80byteで分割
fold -b -w 80 IFGBC509.TXT.u8 > IFGBC509_kaigyo.TXT
#---
grep "検索文字列" ~/grep1_S10.txt |wc -l
#---取得出来ない場合
if [ -z "${CmdString}" ]
then
#---環境変数 FACTRY_PATHの設定
for args in $@
do
#---
zgrep "検索文字列" ./*/*.gz | awk -F"/" '{print $2 "," $3 }' | awk -F":" '{print $1}' | uniq -c
#---
perl ${ACSLIB_SH}/IBCZZ000.pl ${outfile_path}.LF ${outfile_path}
#--- awkの中で$2を返却する際に、ファイル名を置換して返却してくれる
cckfile=`cat ${listFile} | awk -v awkpath="${cckpath}" 'BEGIN{FS=","}{print awkpath"/"$2".cck"}'`
#---
impdp / tables=ORAOWN01.TB_BDMHDK069 dumpfile=TB_BDMHDK069_20170123.dmp table_exists_action=TRUNCATE
# SSH接続 & リモートコマンド実行
exec setsid ssh $SSH_USER@$SSH_HOST $REMOTE_CMD
#--- マッチしたファイル名は件数のみ
matchCount=`bash -c "comm -12 <(cat ${oldFileList}) <(cat ${newFileList})" | wc -l`
#---
find ${findPath} -maxdepth 1 ! -name '*.gz' -type f | gawk -F/ '{print $NF}' | xargs -I{} bash -c "file_bzip2 {} ${findPath}"
#---"各種内訳"
fold -180 /skdata/data/newdata/target/input/issuer/IFNBC263.TXT | grep -c "^.\{33\}D9"
#--- 指定したテーブルをエクスポートする
su - skush101 -c "expdp / dumpfile=${dmpfile} logfile=${logfile} tables=${tablesF} content=DATA_ONLY"
#--- 16進数で検索
grep -c $'\xeb\xc7' *
#---- 使用ユーザー不明確認
fuser -m /skdata/work20
#--- エラーがないか確認
cat joblog/*.log | grep -E `(ERROR|error|WARNING|warning)` | more
#---
filename=`sed <<< ${out_file} "-e s/{KUWAKE}/${kuwake}/g"`
#---
for cIndex in `seq 0 expr ${#FileIN[@]} -1`
do
#---
cat loader/*.LOG | grep '行は' | grep -v ' 0行' | grep -v '成功'
#---
echo ${FileIN[@]}
FileIN=(`echo "$CmdString" | awk 'BEGIN{FS=";"}{print $1}'`)
#---
mo1_file=`awk <<< $args1 'BEGIN{FS="-o "}{print $2}'`
#--- 後述のSSH_ASKPASSで設定したプログラム(本ファイル自身)が返す内容
if [ -n "$PASSWORD" ]; then
cat <<< "$PASSWORD"
exit 0
fi
#---
setDateTime=`date "+%Y%m%d%H%M%S"`
#--- 入力チェック(文字数)
if [ ${uName. } != 8 ]
#---
bash -v -c "ls /home/${uName}"
#---
tail -030 ${loadingFile} | grep IMGBCI194004
#--- 上書き禁止(上書きは -rで実施)
utliupdt -f ${tPath}
#--- glob展開抑止(文字列として判断されなくなる場合が発生する)
★ksarのやり方
こっちがセットアップ用
http://garapon.hatenablog.com/entry/20090323/1237772247
こっちが比較するやり方書いてあるやつ
https://users.miraclelinux.com/support/?q=node/236
ksarの文字化け解消のやり方
http://d.hatena.ne.jp/youhey/20121130/1354259774
★文字を区切るとき
#書き方1args1=`echo $CmdString | awk 'BEGIN{FS=";"}{print $1}'`
#書き方2(こっちのが速い)IFS=';' read args1 args2 <<<${CmdString}
登録:
コメント (Atom)