[20191101]通過zsh計算sql語句的sql_id.txt
[20191101]通過zsh計算sql語句的sql_id.txt
1.簡單介紹以及測試使用zsh遇到的問題:
--//前段時間寫的,連結http://blog.itpub.net/267265/viewspace-2659623/=>[20191011]通過bash計算sql語句的sql_id.txt
--//bash無法直接實現各種進位制的相互轉化,我看了bash手冊以及上網查一些資料.我發現zsh可以直接實現.
--//例子如下:
zsh$ echo $(( [##32]16#$v2 ))
--//這樣可以使用16進位制轉32進位制。v2是16進位制數值。
--//很奇怪的是我linux 伺服器測試環境,無論bash或者zsh都存在一些小問題.
$ echo $BASH_VERSION
3.2.25(1)-release
--//執行echo "sql_id(32) = $(printf "%013s" $res )"前面的0無法輸出。而高版本的bash就沒有這個問題。
--//而zsh也是遇到相似的問題,而且zsh無法通過如下模式提取特定位置字串.例子:
zsh$ v2=${v1:(-16):16}
--//另外執行如下會直接輸出{A..V},bash會輸出 A B .... V.而輸出{0..9}沒問題,奇怪.
zsh$ echo {A..V}
{A..V}
% echo {0..9}
0 1 2 3 4 5 6 7 8 9
--//不過我在windows下的Cygwin64測試沒有問題.
zsh% echo $ZSH_VERSION
4.2.6
--//不過奇怪的是在windows下的Cygwin64,zsh僅僅最大支援36進位制轉換.
--//如下在cygwin下執行:
zsh$ echo $(( 63#F ))
zsh: invalid base (must be 2 to 36 inclusive): 63
--//但是在linux下zsh好像編碼很奇怪.
% echo $(( 64#z ))
35
% echo $(( 64#Z ))
35
--//大小寫zZ輸出都是35,我感覺zsh可能最大支援36進位制,我當前使用版本不報錯罷了.
--//可以確定zsh的編碼字元是0-9 A-Z.雖然支援小寫輸入,但是輸出全部是大小字母或者數字.
zsh$ echo $(( [##16]36#F ))
F
zsh$ echo $(( [##16]36#f ))
F
--//有了以上資訊,編寫轉換程式就很容易了.另外你可以完成在bash下呼叫zsh.只要在開始前寫入#! /bin/zsh.當然前提是你已經安裝了
--//zsh.
2.補充介紹zsh以及其他shell:
--//一般許多linux釋出版本預設shell都是bash,實際上bash已經變得越來越大,支援功能也越來越多,啟動後佔用記憶體也越來越多。這
--//點可以看/bin/bash 檔案大小可以確定。
--//zsh第一次看到它,我的感覺Z表示英文字元最後一個。也許想成為許多shell的終結者。
--//實際上zsh和bash,我個人的感覺兩組開發人員會相互借鑑,我自己個人實在沒時間精力學習它。
--//還有一個shell叫fish,我開始以為fi表示finish的意思,實際上Fish 是"the friendly interactive shell"的簡稱,最大特點就是
--//方便易用。很多其他 Shell 需要配置才有的功能,Fish 預設提供,不需要任何配置。但它的缺點就是與bash相容性較差。
--//csh(tcsh)現在我估計很少人使用了,就不再介紹。
3.測試:
$ export ODEBUG=1
$ ./sql_id.zsh "select /*+ 12345678abdef */ sysdate from dual "
v1=EF5A2C4876C9E93D0A82FF9604F95E26 v2=A82FF9604F95E26 v3=83451430
sql_text = select /*+ 12345678abdef */ sysdate from dual
full_hash_value(16) = EF5A2C4876C9E93D0A82FF9604F95E26
hash_value(10) = 83451430
sql_id(32) = 0p0rzks2gkrj6
sql_id(32) = p0rzks2gkrj6
--//我的這個版本沒有前面輸出前面的0。sql_text輸出沒有後面的的\0.
$ ./sql_id.zsh "select * from emp where deptno=10"
v1=8BB974871A4F8C88529EA4885EFE0842 v2=529EA4885EFE0842 v3=1593706562
sql_text = select * from emp where deptno=10
full_hash_value(16) = 8BB974871A4F8C88529EA4885EFE0842
hash_value(10) = 1593706562
sql_id(32) = 557p4j1ggw222
sql_id(32) = 557p4j1ggw222
--//OK,完全能對上.程式碼看上去更加簡潔.貼一個sql_id.sh輸出:
$ ./sql_id.sh "select * from emp where deptno=10"
sql_text = select * from emp where deptno=10\0
full_hash_value(16) = 8BB974871A4F8C88529EA4885EFE0842
hash_value(10) = 1593706562
sql_id = 557p4j1ggw222
4.指令碼如下:
$ cat sql_id.zsh
#! /bin/zsh
# calcucate sql_text of full_hash_value(16),hash_value(10),sql_id(32).
odebug=${ODEBUG:-0}
sql_text=${1}'\0'
v1=$(echo -e -n "$sql_text" | md5sum | sed 's/ -//' | xxd -r -p | od -t x4 | sed -n -e 's/^0\+ //' -e 's/ //gp' | tr 'a-z' 'A-Z')
#v2=${v1:(-16):16}
#v3=${v2:(-8):8}
v2=$(echo "obase=16;ibase=16; $v1 % 10000000000000000" | bc| tr -d '\\\r\n')
v3=$(echo "obase=10;ibase=16; $v1 % 100000000" | bc| tr -d '\\\r\n')
if [ $odebug -eq 1 ] ; then
echo v1=$v1 v2=$v2 v3=$v3
fi
echo "sql_text = $sql_text"
echo "full_hash_value(16) = $v1 "
echo "hash_value(10) = $v3 "
#echo "hash_value(10) = $(( 16#$v3 )) "
#res=$( echo $(( [##32]16#$v2 )) | tr $( echo {0..9} {A..V}| tr -d ' ') $(echo {0..9} {a..z} | tr -d 'eilo ') )
res=$( echo $(( [##32]16#$v2 )) | tr 'ABCDEFGHIJKLMNOPQRSTUV' 'abcdfghjkmnpqrstuvwxyz' )
echo "sql_id(32) = $(printf "%13s" $res | tr ' ' '0')"
echo "sql_id(32) = $(printf "%013s" $res )"
--//bash的指令碼:
$ cat sql_id.sh
#! /bin/bash
# calcucate sql_text of full_hash_value(16),hash_value(10),sql_id(32).
odebug=${ODEBUG:-0}
sql_text=${1}'\0'
v1=$(echo -e -n "$sql_text" | md5sum | sed 's/ -//' | xxd -r -p | od -t x4 | sed -n -e 's/^0\+ //' -e 's/ //gp' | tr 'a-z' 'A-Z')
v2=${v1:(-16):16}
v3=${v2:(-8):8}
# v2=$(echo "obase=16;ibase=16; $v1 % 10000000000000000" | bc| tr -d '\\\r\n')
# v3=$(echo "obase=10;ibase=16; $v1 % 100000000" | bc| tr -d '\\\r\n')
if [ $odebug -eq 1 ] ; then
echo v1=$v1 v2=$v2 v3=$v3
fi
echo "sql_text = $sql_text"
echo "full_hash_value(16) = $v1 "
echo "hash_value(10) = $(( 16#$v3 )) "
BASE32=($(echo {0..9} {a..z} | tr -d 'eilo'))
res=''
for i in $(echo "obase=32;ibase=16; $v2" | bc| tr -d '\\\r\n')
do
res=${res}${BASE32[$(( 10#$i ))]}
done
echo "sql_id(32) = $(printf "%13s" $res | tr ' ' '0')"
echo "sql_id(32) = $(printf "%013s" $res)"
res1=$(eval $(echo "obase=32;ibase=16; $v2" | bc| tr -d '\\\r\n' | awk 'BEGIN{RS=" +"; printf "echo " }/./{printf "${BASE32[$(( 10#%02d))]} ", $1}' ))
res1=$(tr -d " " <<< $res1)
echo "sql_id(32) = $(printf "%013s" $res1)"
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2662452/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20191011]通過bash計算sql語句的sql_id.txtSQL
- [20211009]使用bash計算sql語句的sql_id.txtSQL
- 通過分析SQL語句的執行計劃優化SQL語句SQL優化
- 通過sql語句分析足彩SQL
- 通過分析SQL語句的執行計劃優化SQL 二SQL優化
- 通過分析SQL語句的執行計劃優化SQL(總結)SQL優化
- oracle 通過sql profile為sql語句加hintOracleSQL
- 通過SQL PROFILE自動優化SQL語句SQL優化
- ORACLE 通過SPM為SQL語句加HINTOracleSQL
- 通過java來格式化sql語句JavaSQL
- 通過使用hint unnest調優sql語句SQL
- 通過java程式抽取日誌中的sql語句JavaSQL
- 通過SQL語句提取儲存過程中的內容SQL儲存過程
- 通過ORA錯誤反思sql語句規範SQL
- 通過sql語句分析足彩(第三篇)SQL
- 通過圖表簡化sql語句的表關聯SQL
- MySQL_通過binlog檢視原始SQL語句MySql
- 用 Phoenix 通過 SQL 語句更新操作 HBase 資料SQL
- 通過Linux命令過濾出binlog中完整的SQL語句LinuxSQL
- 通過日誌檢視mysql正在執行的SQL語句MySql
- 【轉】通過sql語句獲取資料庫的基本資訊SQL資料庫
- 【AWR】通過AWR報告中記錄的 SQL Id獲得SQL語句的執行計劃SQL
- SQL語句的處理過程SQL
- MySQL在ROW模式下通過binlog提取SQL語句MySql模式
- 通過pl/sql計算程式的執行時間SQL
- 透過sql語句分析足彩SQL
- CoreData執行過程的sql語句SQL
- SQL語句的處理過程修正SQL
- 剖析SQL語句的執行過程SQL
- Oracle SQL 語句的執行過程OracleSQL
- 統計介面sql語句SQL
- 透過分析SQL語句的執行計劃最佳化SQL(總結)SQL
- mysql執行sql語句過程MySql
- 通過_optimizer_rownum_pred_based_fkr優化一條sql語句優化SQL
- 一條sql語句的執行過程SQL
- 淺談SQL語句的執行過程SQL
- 理解oracle執行sql語句的過程OracleSQL
- 一條SQL語句的優化過程SQL優化