色々やったので忘れないようにメモを残し
★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}