<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-314  評論-209  文章-0  trackbacks-0
     

    所謂BOM,全稱是Byte Order Mark,它是一個Unicode字符,通常出現在文本的開頭,用來標識字節序(Big/Little Endian),除此以外還可以標識編碼(UTF-8/16/32),如果出現在文本中間,則解釋為zero width no-break space。 注:Unicode相關知識的詳細介紹請參考UTF-8, UTF-16, UTF-32 & BOM

    對于UTF-8/16/32而言,它們名字中的8/16/32指的是編碼單位是多少位的,也就是說,它們的編碼單位分別是8/16/32位,換算成字節就
    是1/2/4字節,如果是多字節,就要牽扯到字節序,UTF-8以單字節為編碼單位,所以不存在字節序。
    UTF-8主要的優點是可以兼容ASCII,但如果使用BOM的話,這個好處就蕩然無存了,除此以外,BOM的存在還可能引發一些問題,比如下面錯誤便都
    有可能是BOM導致的:



    • Shell: No such file or directory
    • PHP: Warning: Cannot modify header information – headers already sent

    在詳細討論UTF-8編碼中BOM的檢測與刪除問題前,不妨先通過一個例子熱熱身:


    shell> curl -s http://phone.10086.cn/ | head -1 | sed -n l
    \357\273\277<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional\
    //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r$

    如上所示,前三個字節分別是357、273、277,這就是八進制的BOM。


    shell> curl -s http://phone.10086.cn/ | head -1 | hexdump -C
    00000000 ef bb bf 3c 21 44 4f 43 54 59 50 45 20 68 74 6d |...<!DOCTYPE htm|
    00000010 6c 20 50 55 42 4c 49 43 20 22 2d 2f 2f 57 33 43 |l PUBLIC "-//W3C|
    00000020 2f 2f 44 54 44 20 58 48 54 4d 4c 20 31 2e 30 20 |//DTD XHTML 1.0 |
    00000030 54 72 61 6e 73 69 74 69 6f 6e 61 6c 2f 2f 45 4e |Transitional//EN|
    00000040 22 20 22 68 74 74 70 3a 2f 2f 77 77 77 2e 77 33 |" "http://www.w3|
    00000050 2e 6f 72 67 2f 54 52 2f 78 68 74 6d 6c 31 2f 44 |.org/TR/xhtml1/D|
    00000060 54 44 2f 78 68 74 6d 6c 31 2d 74 72 61 6e 73 69 |TD/xhtml1-transi|
    00000070 74 69 6f 6e 61 6c 2e 64 74 64 22 3e 0d 0a |tional.dtd">..|

    如上所示,前三個字節分別是EF、BB、BF,這就是十六進制的BOM。 注:用到了第三方網站的頁面,不能保證例子始終可用。
    實際做項目開發時,可能會面對成百上千個文本文件,如果有幾個文件混入了BOM,那么很難察覺,如果沒有帶BOM的UTF-8文本文件,可以用vi杜撰幾
    個,相關命令如下:


    設置UTF-8編碼:


    :set fileencoding=utf-8

    添加BOM:


    :set bomb

    刪除BOM:


    :set nobomb

    查詢BOM:


    :set bomb?

    如何檢測UTF-8編碼中的BOM呢?


    shell> grep -r -I -l $'^\xEF\xBB\xBF' /path

    如何刪除UTF-8編碼中的BOM呢?


    shell> grep -r -I -l $'^\xEF\xBB\xBF' /path | xargs sed -i 's/^\xEF\xBB\xBF//;q'

    推薦:如果你使用SVN的話,可以在pre-commit鉤子里加上相關代碼用以杜絕BOM。


    #!/bin/bash

    REPOS="$1"
    TXN="$2"

    SVNLOOK=/usr/bin/svnlook

    for FILE in $($SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[AU]/ {print $NF}'); do
    if $SVNLOOK cat -t "$TXN" "$REPOS" "$FILE" | grep -q $'^\xEF\xBB\xBF'; then
    echo "Byte Order Mark be found in $FILE" 1>&2
    exit 1
    fi
    done

    本文用到了很多shell命令,篇幅所限,恕不詳述,如果有不明白的就請自己搜索吧。

    posted @ 2016-09-18 09:38 xzc 閱讀(950) | 評論 (0)編輯 收藏

    當我們需要把二進制轉成c語言中使用的16進制字符數組時,命令xxd是很有用的。

    xxd 幫助信息如下:關鍵選項標黑。

    [root@localhost ]# xxd --help
    Usage:
           xxd [options] [infile [outfile]]
        or
           xxd -r [-s [-]offset] [-c cols] [-ps] [infile [outfile]]
    Options:
        -a          toggle autoskip: A single '*' replaces nul-lines. Default off.
        -b          binary digit dump (incompatible with -p,-i,-r). Default hex.
        -c cols     format <cols> octets per line. Default 16 (-i: 12, -ps: 30).
        -E          show characters in EBCDIC. Default ASCII.
        -g          number of octets per group in normal output. Default 2. 每個goup的字節數,默認為2,可設置。
        -h          print this summary.
        -i          output in C include file style. :輸出為c包含文件的風格,數組方式存在。
        -l len      stop after <len> octets.        :轉換到len個字節后停止轉換。
        -ps         output in postscript plain hexdump style.
        -r          reverse operation: convert (or patch) hexdump into binary.
        -r -s off   revert with <off> added to file positions found in hexdump.
        -s [+][-]seek start at <seek> bytes abs. (or +: rel.) infile offset.
       -u          use upper case hex letters. : 字節大寫方式
        -v          show version: "xxd V1.10 27oct98 by Juergen Weigert".

    比如運行:

    > xxd -g 1 -i -u -l 10000000 nm.ts > xxd_test.txt

    生成的文本顯示:

    unsigned char __0513_1634_ch32_666_10_ts[] = {
    0X47, 0X02, 0X03, 0X13, 0XF8, 0X5A, 0XC5, 0X40, 0X26, 0XE4, 0XD0, 0XDE,
    0XAD, 0XB8, 0X76, 0X89, 0X85, 0X23, 0X06, 0X04, 0X6E, 0X05, 0X8B, 0X09,
    0XC0, 0X5C, 0X96, 0X4F, 0X18, 0X51, 0X41, 0XC8, 0X40, 0X9F, 0X06, 0X93,
    0X38, 0XC1, 0XBB, 0X1A, 0XBC, 0XAC, 0X47, 0XFF, 0X5E, 0X54, 0XEB, 0XA7,
    0X14, 0X36, 0X85, 0X8A, 0X90, 0X14, 0X17, 0XA2, 0X9D, 0XC0, 0X84, 0X56,
    0XCB, 0X97, 0X78, 0XC8, 0X57, 0X15, 0X3E, 0X61, 0X6F, 0XFE, 0XC9, 0X39,
    0XEF, 0XD3, 0XB6, 0X6A, 0XD2, 0XE4, 0XFB, 0X4C, 0X05, 0XF6, 0X03, 0XED,
    0X50, 0XB3, 0XE7, 0X46, 0X57, 0X24, 0X71, 0X16, 0X38, 0X45, 0X53, 0X19,
    0X56, 0X25, 0X3C, 0X8D, 0X4C, 0XA9, 0X28, 0X9A, 0XB2, 0X99, 0X76, 0X52,
    0X28, 0XE9, 0XD6, 0XD6, 0X11, 0X94, 0X89, 0X19, 0X4D, 0XEA, 0X68, 0X76,
    0X53, 0XC6, 0XAA, 0X3A, 0XD4, 0XA1, 0X25, 0XA5, 0X03, 0XB0, 0X73, 0XA0,
    0XAE, 0X11, 0XC9, 0XBD, 0X37, 0X17, 0X11, 0X5F, 0X30, 0X34, 0X34, 0X0B

    .....

    };

    unsigned int nm.ts_len = 10000000;

    另外,在vim中也可以把文件轉換為16進制來顯示:

    :%!xxd

    返回正常顯示:

    :%!xxd -r

     

    linux下查看二進制文件
    以十六進制格式輸出:
    od [選項] 文件
    od -d 文件  十進制輸出
       -o 文件  八進制輸出
       -x 文件  十六進制輸出
    xxd 文件  輸出十六進制

    在vi命令狀態下:
    :%!xxd   :%!od    將當前文本轉化為16進制格式
    :%!xxd -c 12 每行顯示12個字節
    :%!xxd -r    將當前文本轉化回文本格式

    posted @ 2016-09-18 09:38 xzc 閱讀(2531) | 評論 (0)編輯 收藏

    一、IFS 介紹

         Shell 腳本中有個變量叫 IFS(Internal Field Seprator) ,內部域分隔符。完整定義是The shell uses the value stored in IFS, which is the space, tab, and newline characters by default, to delimit words for the read and set commands, when parsing output from command substitution, and when performing variable substitution.

         Shell 的環境變量分為 set, env 兩種,其中 set 變量可以通過 export 工具導入到 env 變量中。其中,set 是顯示設置shell變量,僅在本 shell 中有效;env 是顯示設置用戶環境變量 ,僅在當前會話中有效。換句話說,set 變量里包含了 env 變量,但 set 變量不一定都是 env 變量。這兩種變量不同之處在于變量的作用域不同。顯然,env 變量的作用域要大些,它可以在 subshell 中使用。

         而 IFS 是一種 set 變量,當 shell 處理"命令替換"和"參數替換"時,shell 根據 IFS 的值,默認是 space, tab, newline 來拆解讀入的變量,然后對特殊字符進行處理,最后重新組合賦值給該變量。

    二、IFS 簡單實例

    1、查看變量 IFS 的值。

    $ echo $IFS  $ echo "$IFS" | od -b 0000000 040 011 012 012 0000004

    直接輸出IFS是看不到的,把它轉化為二進制就可以看到了,"040"是空格,"011"是Tab,"012"是換行符"\n" 。最后一個 012 是因為 echo 默認是會換行的。

    2、$* 和 $@ 的細微差別
         從下面的例子中可以看出,如果是用冒號引起來,表示這個變量不用IFS替換!!所以可以看到這個變量的"原始值"。反之,如果不加引號,輸出時會根據IFS的值來分割后合并輸出! $* 是按照IFS中的第一個值來確定的!下面這兩個例子還有細微的差別!

    $ IFS=:; $ set x y z $ echo $* x y z $ echo "$*" x:y:z $ echo $@ x y z $ echo "$@" x y z
     上例 set 變量其實是3個參數,而下面這個例子實質是2個參數,即 set "x y z"  和 set x y z 是完全不同的。
    $ set "x" "y z" $ echo $* x y z $ echo "$*" x:y z $ echo $@ x y z $ echo "$@" x y z $ echo $* |od -b 0000000 170 040 171 040 172 012 0000006 $ echo "$*" |od -b 0000000 170 072 171 040 172 012 0000006

    小結:$* 會根據 IFS 的不同來組合值,而 $@ 則會將值用" "來組合值!

    3、for 循環中的奇怪現象

    1. $ for x in $var ;do echo $x |od -b ;done  
    2. 0000000 012  
    3. 0000001  
    4. 0000000 040 141 012  
    5. 0000003  
    6. 0000000 142 012  
    7. 0000002  
    8. 0000000 012  
    9. 0000001  
    10. 0000000 143 012  
    11. 0000002  
    $ for x in $var ;do echo $x |od -b ;done 0000000 012 0000001 0000000 040 141 012 0000003 0000000 142 012 0000002 0000000 012 0000001 0000000 143 012 0000002

     

    先暫且不解釋 for 循環的內容!看下面這個輸出!IFS 的值同上! var=": a:b::c:"
    $ echo $var |od -b 0000000 040 040 141 040 142 040 040 143 012 0000011 $ echo "$var" |od -b 0000000 072 040 141 072 142 072 072 143 072 012 0000012

    "$var"的值應該沒做替換,所以還是 ": a:b::c:" (注 "072" 表示冒號),但是$var 則發生了變化!注意輸出的最后一個冒號沒有了,也沒有替換為空格!Why?

     

    使用 $var 時是經歷了這樣一個過程!首先,按照這樣的規則 [變量][IFS][變量][IFS]……根據原始 var 值中所有的分割符(此處是":")劃分出變量,如果IFS的值是有多個字符組成,如IFS=":;",那么此處的[IFS]指的是IFS中的任意一個字符($* 是按第一個字符來分隔!),如 ":" 或者 ";" ,后面不再對[IFS]做類似說明!(注:[IFS]會有多個值,多虧 #blackold 的提醒);然后,得到類似這樣的 list, ""   " a"   "b"  ""   "c"  。如果此時 echo $var,則需要在這些變量之間用空格隔開,也就是""  [space]   "  a"  [space]  "b" [space]  "" [space]  "c" ,忽略掉空值最終輸出是 [space][space]a[space]b[space][space]c

    如果最后一個字符不是分隔符,如 var="a:b",那么最后一個分隔符后的變量就是最后一個變量!

    這個地方要注意下!!如果IFS就是空格,那么類似于" [space][space]a[space]b[space][space]c "會合并重復的部分,且去頭空格,去尾空格,那么最終輸出會變成類似 a[space]b[space]c ,所以,如果IFS是默認值,那么處理的結果就很好算出來,直接合并、忽略多余空格即可!

    另外,$* 和 $@ 在函數中的處理過程是這樣的(只考慮"原始值"!)!"$@",就是像上面處理后賦值,但是 "$*" 卻不一樣!它的值是用分隔符(如":")而不是空格隔開!具體例子見最后一個例子!

    好了,現在來解釋 for 循環的內容。for 循環遍歷上面這個列表就可以了,所以 for 循環的第一個輸出是空!("012"是echo輸出的換行符 )。。。。后面的依次類推!不信可以試試下面這個例子,結果是一樣的!

    $ for x in "" " a" "b" "" "c" ;do echo $x |od -b ;done 0000000 012 0000001 0000000 040 141 012 0000003 0000000 012 0000001 0000000 142 012 0000002 0000000 012 0000001 0000000 143 012 0000002

    三、IFS的其他實例

    Example 1:

     

    $ IFS=: $ var=ab::cd $ echo $var ab  cd $ echo "$var" ab::cd
    解釋下:x 的值是 "ab::cd",當進行到 echo $x 時,因為$符,所以會進行變量替換。Shell 根據 IFS 的值將 x 分解為 ab "" cd,然后echo,插入空隔,ab[space]""[space]cd,忽略"",輸出  ab  cd 。

    Example 2 :

    1. $ read a  
    2.        xy  z  
    3. $ echo $a  
    4. xy  z  
    $ read a        xy  z $ echo $a xy  z

    解釋:這是 http://bbs.chinaunix.net/thread-207178-1-1.html 上的一個例子。此時IFS是默認值,本希望把所有的輸入(包括空格)都放入變量a中,但是輸出的a卻把前面的空格給忽略了!!原因是:默認的 IFS 會按 space tab newline 來分割。這里需要注意的一點是,read 命令的實現過程,即在讀入時已經替換了。解決辦法是在開頭加上一句 IFS=";" ,這里必須加上雙引號,因為分號有特殊含義。

    Example 3 :

    $ tmp="   xy z" $ a=$tmp $ echo $a $ echo "$a"

    解釋:什么時候會根據 IFS 來"處理"呢?我覺得是,對于不加引號的變量,使用時都會參考IFS,但是要注意其原始值!

    Example 4 :

    1. #!/bin/bash  
    2. IFS_old=$IFS      #將原IFS值保存,以便用完后恢復  
    3. IFS=$’\n’        #更改IFS值為$’\n’ ,注意,以回車做為分隔符,IFS必須為:$’\n’  
    4. for i in $((cat pwd.txt)) #pwd.txt 來自這個命令:cat /etc/passwd >pwd.txt  
    5. do  
    6.     echo $i  
    7. done  
    8. IFS=$IFS_old      #恢復原IFS值  
    #!/bin/bash IFS_old=$IFS      #將原IFS值保存,以便用完后恢復 IFS=$’\n’        #更改IFS值為$’\n’ ,注意,以回車做為分隔符,IFS必須為:$’\n’ for i in $((cat pwd.txt)) #pwd.txt 來自這個命令:cat /etc/passwd >pwd.txt do     echo $i done IFS=$IFS_old      #恢復原IFS值
    另外一個例子,把IP地址逆轉輸出:

    Example 5 :

    #!/bin/bash  IP=220.112.253.111 IFS="." TMPIP=$(echo $IP) IFS=" " # space echo $TMPIP for x in $TMPIP ;do      Xip="${x}.$Xip" done echo ${Xip%.}

    Complex_Example 1:  http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3660898&page=1#pid21798049

    function output_args_ifs(){     echo "=$*"     echo "="$*     for m in $* ;do          echo "[$m]"     done }  IFS=':' var='::a:b::c:::' output_args_ifs $var

     

    輸出為:

    1. =::a:b::c::  # 少了最后一個冒號!看前面就知道為什么了  
    2. =  a b  c   
    3. []  
    4. []  
    5. [a]  
    6. [b]  
    7. []  
    8. [c]  
    9. []  
    =::a:b::c::  # 少了最后一個冒號!看前面就知道為什么了 =  a b  c  [] [] [a] [b] [] [c] []

    由于 "output_args_ifs $var" 中 $var 沒有加引號,所以根據IFS替換!根據IFS劃分出變量: ""  ""  "a"  "b"  ""  "c" "" ""(可以通過輸出 $# 來測試參數的個數!),重組的結果為

     "$@" 的值是  "" [space] "" [space]  "a" [space]  "b"  [space] "" [space]  "c" [space] "" [space] "",可以通過,echo==>"  a b  c   "
    "$*" 的值是   "" [IFS] "" [IFS]  "a" [IFS]  "b"  [IFS] "" [IFS]  "c" [IFS] "" [IFS] "",忽略"",echo=>"::a:b::c::"

    注意, $* 和 $@ 的值都是  ""   ""   "a"   "b"   ""   "c"  ""  "" 。可以說是一個列表……因為他們本來就是由 $1 $2 $3……組成的。

    所以,《Linux程序設計》里推薦使用 $@,而不是$*

    總結:IFS 其實還是很麻煩的,稍有不慎就會產生很奇怪的結果,因此使用的時候要注意!我也走了不少彎路,只希望能給后來者一些幫助。本文若有問題,歡迎指正!!謝謝!

    如有轉載,請注明blog.csdn.net/whuslei
    參考:
    http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=94358
    http://smilejay.com/2011/12/bash_ifs/#comment-51

    posted @ 2016-04-01 15:00 xzc 閱讀(278) | 評論 (1)編輯 收藏

    MYSQL 獲取當前日期及日期格式
    獲取系統日期: NOW()
    格式化日期: DATE_FORMAT(date, format)
    注: date:時間字段
    format:日期格式

    返回系統日期,輸出 2009-12-25 14:38:59
    select now();
    輸出 09-12-25
    select date_format(now(),'%y-%m-%d');

    根據format字符串格式化date值:

    %S, %s 兩位數字形式的秒( 00,01, ..., 59)
    %I, %i 兩位數字形式的分( 00,01, ..., 59)
    %H 兩位數字形式的小時,24 小時(00,01, ..., 23)
    %h 兩位數字形式的小時,12 小時(01,02, ..., 12)
    %k 數字形式的小時,24 小時(0,1, ..., 23)
    %l 數字形式的小時,12 小時(1, 2, ..., 12)
    %T 24 小時的時間形式(hh:mm:ss)
    %r 12 小時的時間形式(hh:mm:ss AM 或hh:mm:ss PM)
    %p AM或PM
    %W 一周中每一天的名稱(Sunday, Monday, ..., Saturday)
    %a 一周中每一天名稱的縮寫(Sun, Mon, ..., Sat)
    %d 兩位數字表示月中的天數(00, 01,..., 31)
    %e 數字形式表示月中的天數(1, 2, ..., 31)
    %D 英文后綴表示月中的天數(1st, 2nd, 3rd,...)
    %w 以數字形式表示周中的天數( 0 = Sunday, 1=Monday, ..., 6=Saturday)
    %j 以三位數字表示年中的天數( 001, 002, ..., 366)
    %U 周(0, 1, 52),其中Sunday 為周中的第一天
    %u 周(0, 1, 52),其中Monday 為周中的第一天
    %M 月名(January, February, ..., December)
    %b 縮寫的月名( January, February,...., December)
    %m 兩位數字表示的月份(01, 02, ..., 12)
    %c 數字表示的月份(1, 2, ...., 12)
    %Y 四位數字表示的年份
    %y 兩位數字表示的年份
    %% 直接值“%”

     

     

    curdate()

     

    MySQL 獲得當前日期時間 函數
    1.1 獲得當前日期+時間(date + time)函數:now()

    mysql> select now();

    +---------------------+
    | now() |
    +---------------------+
    | 2008-08-08 22:20:46 |
    +---------------------+
    除了 now() 函數能獲得當前的日期時間外,MySQL 中還有下面的函數:

    current_timestamp()
    ,current_timestamp
    ,localtime()
    ,localtime
    ,localtimestamp -- (v4.0.6)
    ,localtimestamp() -- (v4.0.6)
    這些日期時間函數,都等同于 now()。鑒于 now() 函數簡短易記,建議總是使用 now() 來替代上面列出的函數。

    1.2 獲得當前日期+時間(date + time)函數:sysdate()

    sysdate() 日期時間函數跟 now() 類似,不同之處在于:now() 在執行開始時值就得到了, sysdate() 在函數執行時動態得到值。看下面的例子就明白了:

    mysql> select now(), sleep(3), now();

    +---------------------+----------+---------------------+
    | now() | sleep(3) | now() |
    +---------------------+----------+---------------------+
    | 2008-08-08 22:28:21 | 0 | 2008-08-08 22:28:21 |
    +---------------------+----------+---------------------+mysql> select sysdate(), sleep(3), sysdate();

    +---------------------+----------+---------------------+
    | sysdate() | sleep(3) | sysdate() |
    +---------------------+----------+---------------------+
    | 2008-08-08 22:28:41 | 0 | 2008-08-08 22:28:44 |
    +---------------------+----------+---------------------+
    可以看到,雖然中途 sleep 3 秒,但 now() 函數兩次的時間值是相同的; sysdate() 函數兩次得到的時間值相差 3秒。MySQL Manual 中是這樣描述 sysdate() 的:Return the time at which the functionexecutes。

    sysdate() 日期時間函數,一般情況下很少用到。

    2. 獲得當前日期(date)函數:curdate()

    mysql> select curdate();

    +------------+
    | curdate() |
    +------------+
    | 2008-08-08 |
    +------------+
    其中,下面的兩個日期函數等同于 curdate():

    current_date()
    ,current_date
    3. 獲得當前時間(time)函數:curtime()

    mysql> select curtime();

    +-----------+
    | curtime() |
    +-----------+
    | 22:41:30 |
    +-----------+
    其中,下面的兩個時間函數等同于 curtime():

    current_time()
    ,current_time
    4. 獲得當前 UTC 日期時間函數:utc_date(), utc_time(), utc_timestamp()

    mysql> select utc_timestamp(), utc_date(), utc_time(), now()

    +---------------------+------------+------------+---------------------+
    | utc_timestamp() | utc_date() | utc_time() | now() |
    +---------------------+------------+------------+---------------------+
    | 2008-08-08 14:47:11 | 2008-08-08 | 14:47:11 | 2008-08-08 22:47:11 |
    +---------------------+------------+------------+---------------------+
    因為我國位于東八時區,所以本地時間 = UTC 時間 + 8 小時。UTC 時間在業務涉及多個國家和地區的時候,非常有用。

    二、MySQL 日期時間 Extract(選取) 函數。
    1. 選取日期時間的各個部分:日期、時間、年、季度、月、日、小時、分鐘、秒、微秒

    set @dt = '2008-09-10 07:15:30.123456';

    select date(@dt); -- 2008-09-10
    select time(@dt); -- 07:15:30.123456
    select year(@dt); -- 2008
    select quarter(@dt); -- 3
    select month(@dt); -- 9
    select week(@dt); -- 36
    select day(@dt); -- 10
    select hour(@dt); -- 7
    select minute(@dt); -- 15
    select second(@dt); -- 30
    select microsecond(@dt); -- 123456
    2. MySQL Extract() 函數,可以上面實現類似的功能:

    set @dt = '2008-09-10 07:15:30.123456';

    select extract(year from @dt); -- 2008
    select extract(quarter from @dt); -- 3
    select extract(month from @dt); -- 9
    select extract(week from @dt); -- 36
    select extract(day from @dt); -- 10
    select extract(hour from @dt); -- 7
    select extract(minute from @dt); -- 15
    select extract(second from @dt); -- 30
    select extract(microsecond from @dt); -- 123456select extract(year_month from @dt); -- 200809
    select extract(day_hour from @dt); -- 1007
    select extract(day_minute from @dt); -- 100715
    select extract(day_second from @dt); -- 10071530
    select extract(day_microsecond from @dt); -- 10071530123456
    select extract(hour_minute from @dt); -- 715
    select extract(hour_second from @dt); -- 71530
    select extract(hour_microsecond from @dt); -- 71530123456
    select extract(minute_second from @dt); -- 1530
    select extract(minute_microsecond from @dt); -- 1530123456
    select extract(second_microsecond from @dt); -- 30123456
    MySQLExtract() 函數除了沒有date(),time() 的功能外,其他功能一應具全。并且還具有選取‘day_microsecond’等功能。注意這里不是只選取 day 和 microsecond,而是從日期的 day 部分一直選取到 microsecond 部分。夠強悍的吧!

    MySQL Extract() 函數唯一不好的地方在于:你需要多敲幾次鍵盤。

    3. MySQL dayof… 函數:dayofweek(), dayofmonth(), dayofyear()

    分別返回日期參數,在一周、一月、一年中的位置。

    set @dt = '2008-08-08';

    select dayofweek(@dt); -- 6
    select dayofmonth(@dt); -- 8
    select dayofyear(@dt); -- 221
    日期 ‘2008-08-08′ 是一周中的第 6 天(1 = Sunday, 2 = Monday, …, 7 = Saturday);一月中的第 8 天;一年中的第 221 天。

    4. MySQL week… 函數:week(), weekofyear(), dayofweek(), weekday(), yearweek()

    set @dt = '2008-08-08';

    select week(@dt); -- 31
    select week(@dt,3); -- 32
    select weekofyear(@dt); -- 32

    select dayofweek(@dt); -- 6
    select weekday(@dt); -- 4

    select yearweek(@dt); -- 200831
    MySQL week() 函數,可以有兩個參數,具體可看手冊。 weekofyear() 和 week() 一樣,都是計算“某天”是位于一年中的第幾周。 weekofyear(@dt) 等價于 week(@dt,3)。

    MySQLweekday() 函數和 dayofweek() 類似,都是返回“某天”在一周中的位置。不同點在于參考的標準, weekday:(0 =Monday, 1 = Tuesday, …, 6 = Sunday); dayofweek:(1 = Sunday, 2 = Monday,…, 7 = Saturday)

    MySQL yearweek() 函數,返回 year(2008) + week 位置(31)。

    5. MySQL 返回星期和月份名稱函數:dayname(), monthname()

    set @dt = '2008-08-08';

    select dayname(@dt); -- Friday
    select monthname(@dt); -- August
    思考,如何返回中文的名稱呢?

    6. MySQL last_day() 函數:返回月份中的最后一天。

    select last_day('2008-02-01'); -- 2008-02-29
    select last_day('2008-08-08'); -- 2008-08-31
    MySQL last_day() 函數非常有用,比如我想得到當前月份中有多少天,可以這樣來計算:

    mysql> select now(), day(last_day(now())) as days;

    +---------------------+------+
    | now() | days |
    +---------------------+------+
    | 2008-08-09 11:45:45 | 31 |
    +---------------------+------+ 三、MySQL 日期時間計算函數
    1. MySQL 為日期增加一個時間間隔:date_add()

    set @dt = now();

    select date_add(@dt, interval 1 day); -- add 1 day
    select date_add(@dt, interval 1 hour); -- add 1 hour
    select date_add(@dt, interval 1 minute); -- ...
    select date_add(@dt, interval 1 second);
    select date_add(@dt, interval 1 microsecond);
    select date_add(@dt, interval 1 week);
    select date_add(@dt, interval 1 month);
    select date_add(@dt, interval 1 quarter);
    select date_add(@dt, interval 1 year);select date_add(@dt, interval -1 day); -- sub 1 day
    MySQL adddate(), addtime()函數,可以用 date_add() 來替代。下面是 date_add() 實現 addtime() 功能示例:

    mysql> set @dt = '2008-08-09 12:12:33';

    mysql>
    mysql> select date_add(@dt, interval '01:15:30' hour_second);

    +------------------------------------------------+
    | date_add(@dt, interval '01:15:30' hour_second) |
    +------------------------------------------------+
    | 2008-08-09 13:28:03 |
    +------------------------------------------------+mysql> select date_add(@dt, interval '1 01:15:30' day_second);

    +-------------------------------------------------+
    | date_add(@dt, interval '1 01:15:30' day_second) |
    +-------------------------------------------------+
    | 2008-08-10 13:28:03 |
    +-------------------------------------------------+
    date_add() 函數,分別為 @dt 增加了“1小時 15分 30秒” 和 “1天 1小時 15分 30秒”。建議:總是使用 date_add() 日期時間函數來替代 adddate(), addtime()。

    2. MySQL 為日期減去一個時間間隔:date_sub()

    mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);

    +----------------------------------------------------------------+
    | date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |
    +----------------------------------------------------------------+
    | 1997-12-30 22:58:59 |
    +----------------------------------------------------------------+
    MySQL date_sub() 日期時間函數 和 date_add() 用法一致,不再贅述。另外,MySQL 中還有兩個函數 subdate(), subtime(),建議,用 date_sub() 來替代。

    3. MySQL 另類日期函數:period_add(P,N), period_diff(P1,P2)

    函數參數“P” 的格式為“YYYYMM” 或者 “YYMM”,第二個參數“N” 表示增加或減去 N month(月)。

    MySQL period_add(P,N):日期加/減去N月。

    mysql> select period_add(200808,2), period_add(20080808,-2)

    +----------------------+-------------------------+
    | period_add(200808,2) | period_add(20080808,-2) |
    +----------------------+-------------------------+
    | 200810 | 20080806 |
    +----------------------+-------------------------+
    MySQL period_diff(P1,P2):日期 P1-P2,返回 N 個月。

    mysql> select period_diff(200808, 200801);

    +-----------------------------+
    | period_diff(200808, 200801) |
    +-----------------------------+
    | 7 |
    +-----------------------------+
    在 MySQL 中,這兩個日期函數,一般情況下很少用到。

    4. MySQL 日期、時間相減函數:datediff(date1,date2), timediff(time1,time2)

    MySQL datediff(date1,date2):兩個日期相減 date1 - date2,返回天數。

    select datediff('2008-08-08', '2008-08-01'); -- 7
    select datediff('2008-08-01', '2008-08-08'); -- -7
    MySQL timediff(time1,time2):兩個日期相減 time1 - time2,返回 time 差值。

    select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
    select timediff('08:08:08', '00:00:00'); -- 08:08:08
    注意:timediff(time1,time2) 函數的兩個參數類型必須相同。

    四、MySQL 日期轉換函數、時間轉換函數
    1. MySQL (時間、秒)轉換函數:time_to_sec(time), sec_to_time(seconds)

    select time_to_sec('01:00:05'); -- 3605
    select sec_to_time(3605); -- '01:00:05'
    2. MySQL (日期、天數)轉換函數:to_days(date), from_days(days)

    select to_days('0000-00-00'); -- 0
    select to_days('2008-08-08'); -- 733627select from_days(0); -- '0000-00-00'
    select from_days(733627); -- '2008-08-08'
    3. MySQL Str to Date (字符串轉換為日期)函數:str_to_date(str, format)

    select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09
    select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09
    select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09
    select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30
    select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30
    可以看到,str_to_date(str,format) 轉換函數,可以把一些雜亂無章的字符串轉換為日期格式。另外,它也可以轉換為時間。“format” 可以參看 MySQL 手冊。

    4. MySQL Date/Time to Str(日期/時間轉換為字符串)函數:date_format(date,format), time_format(time,format)

    mysql> select date_format('2008-08-08 22:23:00', '%W %M %Y');

    +------------------------------------------------+
    | date_format('2008-08-08 22:23:00', '%W %M %Y') |
    +------------------------------------------------+
    | Friday August 2008 |
    +------------------------------------------------+mysql> select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s');

    +----------------------------------------------------+
    | date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') |
    +----------------------------------------------------+
    | 20080808222301 |
    +----------------------------------------------------+mysql> select time_format('22:23:01', '%H.%i.%s');

    +-------------------------------------+
    | time_format('22:23:01', '%H.%i.%s') |
    +-------------------------------------+
    | 22.23.01 |
    +-------------------------------------+
    MySQL 日期、時間轉換函數:date_format(date,format), time_format(time,format) 能夠把一個日期/時間轉換成各種各樣的字符串格式。它是 str_to_date(str,format) 函數的 一個逆轉換。

    5. MySQL 獲得國家地區時間格式函數:get_format()

    MySQL get_format() 語法:

    get_format(date|time|datetime, 'eur'|'usa'|'jis'|'iso'|'internal'
    MySQL get_format() 用法的全部示例:

    select get_format(date,'usa') ; -- '%m.%d.%Y'
    select get_format(date,'jis') ; -- '%Y-%m-%d'
    select get_format(date,'iso') ; -- '%Y-%m-%d'
    select get_format(date,'eur') ; -- '%d.%m.%Y'
    select get_format(date,'internal') ; -- '%Y%m%d'
    select get_format(datetime,'usa') ; -- '%Y-%m-%d %H.%i.%s'
    select get_format(datetime,'jis') ; -- '%Y-%m-%d %H:%i:%s'
    select get_format(datetime,'iso') ; -- '%Y-%m-%d %H:%i:%s'
    select get_format(datetime,'eur') ; -- '%Y-%m-%d %H.%i.%s'
    select get_format(datetime,'internal') ; -- '%Y%m%d%H%i%s'
    select get_format(time,'usa') ; -- '%h:%i:%s %p'
    select get_format(time,'jis') ; -- '%H:%i:%s'
    select get_format(time,'iso') ; -- '%H:%i:%s'
    select get_format(time,'eur') ; -- '%H.%i.%s'
    select get_format(time,'internal') ; -- '%H%i%s'
    MySQL get_format() 函數在實際中用到機會的比較少。

    6. MySQL 拼湊日期、時間函數:makdedate(year,dayofyear), maketime(hour,minute,second)

    select makedate(2001,31); -- '2001-01-31'
    select makedate(2001,32); -- '2001-02-01'select maketime(12,15,30); -- '12:15:30' 五、MySQL 時間戳(Timestamp)函數
    1. MySQL 獲得當前時間戳函數:current_timestamp, current_timestamp()

    mysql> select current_timestamp, current_timestamp();

    +---------------------+---------------------+
    | current_timestamp | current_timestamp() |
    +---------------------+---------------------+
    | 2008-08-09 23:22:24 | 2008-08-09 23:22:24 |
    +---------------------+---------------------+
    2. MySQL (Unix 時間戳、日期)轉換函數:

    unix_timestamp(),
    unix_timestamp(date),
    from_unixtime(unix_timestamp),
    from_unixtime(unix_timestamp,format)
    下面是示例:

    select unix_timestamp(); -- 1218290027
    select unix_timestamp('2008-08-08'); -- 1218124800
    select unix_timestamp('2008-08-08 12:30:00'); -- 1218169800select from_unixtime(1218290027); -- '2008-08-09 21:53:47'
    select from_unixtime(1218124800); -- '2008-08-08 00:00:00'
    selectfrom_unixtime(1218169800); -- '2008-08-08 12:30:00'selectfrom_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August12:30:00 2008'
    3. MySQL 時間戳(timestamp)轉換、增、減函數:

    timestamp(date) -- date to timestamp
    timestamp(dt,time) -- dt + time
    timestampadd(unit,interval,datetime_expr) --
    timestampdiff(unit,datetime_expr1,datetime_expr2) --
    請看示例部分:

    select timestamp('2008-08-08'); -- 2008-08-08 00:00:00
    select timestamp('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01
    selecttimestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-1809:01:01select timestampadd(day, 1, '2008-08-08 08:00:00'); --2008-08-09 08:00:00
    select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00
    MySQL timestampadd() 函數類似于 date_add()。

    select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1
    select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485
    select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12

    select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7
    MySQL timestampdiff() 函數就比 datediff() 功能強多了,datediff() 只能計算兩個日期(date)之間相差的天數。

    六、MySQL 時區(timezone)轉換函數convert_tz(dt,from_tz,to_tz)selectconvert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-0804:00:00
    時區轉換也可以通過 date_add, date_sub, timestampadd 來實現。

    select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00
    select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00
    select timestampadd(hour, -8, '2008-08-08 12:00:00'); -- 2008-08-08 04:00:00

    posted @ 2016-03-30 10:33 xzc 閱讀(340) | 評論 (2)編輯 收藏

    在項目中遇到一個奇怪的bug,是由一行簡單代碼引起的。
    代碼作用:比較兩個UNIX文本文件,找出并打印文本2比文本1新增加的內容。
    代碼調用了diff命令,例如:
     
     

    復制代碼
    代碼如下:

    # temp1.txt文件內容
    $> cat temp1.txt
    20110224
    20110225
    20110228
    20110301
    20110302
    # temp2.txt文件內容
    $> cat temp2.txt
    20110228
    20110301
    20110302
    20110303
    20110304

     

    # diff命令輸出結果


    復制代碼
    代碼如下:

    $> diff temp1.txt temp2.txt
    1,2d0
    < 20110224
    < 20110225
    5a4,5
    > 20110303
    > 20110304
    # 只輸出temp2.txt文件獨有的內容
    $> diff temp1.txt temp2.txt | grep "> " | sed 's/> //g'
    20110303
    20110304

     

    說明:輸出結果去掉了兩個文件的共同內容,只輸出了temp2.txt的新增部分,和預想的結果一樣。
     
    但是,隨著temp1.txt文件內容的增加,diff命令出現了不同預期的結果:


    復制代碼
    代碼如下:

    $> cat temp1.txt
    20101216
    20101217
    20101220
    20101221
    20101223
    20101224
    20101227
    20101228
    20101229
    20101230
    20101231
    20110103
    20110104
    20110105
    20110106
    20110107
    20110110
    20110111
    20110112
    20110113
    20110114
    20110117
    20110118
    20110119
    20110120
    20110121
    20110124
    20110125
    20110126
    20110127
    20110128
    20110131
    20110201
    20110202
    20110203
    20110204
    20110207
    20110208
    20110209
    20110210
    20110211
    20110214
    20110215
    20110216
    20110217
    20110218
    20110221
    20110222
    20110223
    20110224
    20110225
    20110228
    20110301
    20110302
    20110303
    $> cat temp2.txt
    20110228
    20110301
    20110302
    20110303
    20110304
    20110307
    20110308
    20110309
    20110310
    20110311
    20110314
    $> diff temp1.txt temp2.txt
    1,55c1,11
    < 20101216
    < 20101217
    < 20101220
    < 20101221
    < 20101223
    < 20101224
    < 20101227
    < 20101228
    < 20101229
    < 20101230
    < 20101231
    < 20110103
    < 20110104
    < 20110105
    < 20110106
    < 20110107
    < 20110110
    < 20110111
    < 20110112
    < 20110113
    < 20110114
    < 20110117
    < 20110118
    < 20110119
    < 20110120
    < 20110121
    < 20110124
    < 20110125
    < 20110126
    < 20110127
    < 20110128
    < 20110131
    < 20110201
    < 20110202
    < 20110203
    < 20110204
    < 20110207
    < 20110208
    < 20110209
    < 20110210
    < 20110211
    < 20110214
    < 20110215
    < 20110216
    < 20110217
    < 20110218
    < 20110221
    < 20110222
    < 20110223
    < 20110224
    < 20110225
    < 20110228
    < 20110301
    < 20110302
    < 20110303
    ---
    > 20110228
    > 20110301
    > 20110302
    > 20110303
    > 20110304
    > 20110307
    > 20110308
    > 20110309
    > 20110310
    > 20110311
    > 20110314
    $> diff temp1.txt temp2.txt | grep "> " | sed 's/> //g'
    20110228
    20110301
    20110302
    20110303
    20110304
    20110307
    20110308
    20110309
    20110310
    20110311
    20110314

     

    可以看到,diff命令不但輸出了temp2.txt文件的新增部分(20110304-20110314),也同時輸出了兩個文件的共同內容(20110228-20110303),從而導致了與預期不一致的結果。
    查看diff命令的man手冊發現,diff的作用是比較兩個文件的內容,并輸出兩個文件之間的差異,產生一個能夠將兩個文件互相轉換的列表,但這個列表并不能100%保證是最小集。
    于是,以上例子中,可以看到diff給出了temp1.txt和temp2.txt文件的比較差異結果,但其中包含了兩個文件的共同部分,因此與預期不一樣。
     
    解決方法:
    用comm命令代替diff,例如:


    復制代碼
    代碼如下:

    $> comm -13 temp1.txt temp2.txt
    20110304
    20110307
    20110308
    20110309
    20110310
    20110311
    20110314

     

    comm命令用來比較兩個文件,具體用法:
    comm [-123] file1 file2
    -1 過濾file1獨有的內容
    -2 過濾file2獨有的內容
    -3 過濾file1和file2重復的內容
     
    備注:
    diff的輸出格式,主要有以下幾種:
    n1 a n3,n4
    n1,n2 d n3
    n1,n2 c n3,n4
    例如"1,2d0" "5a4,5" "1,55c1,11"等。
    其中n1和n2指第一個文件的行數,n3和n4指第二個文件的行數。"a"代表add增加,"d"代表delete刪除,"c"代表change整塊變動。
    有了diff的輸出結果,可以使用patch命令將一個文件恢復成另一個,例如:


    復制代碼
    代碼如下:

    $> cat temp1.txt
    20110224
    20110225
    20110228
    20110301
    20110302
    $> cat temp2.txt
    20110228
    20110301
    20110302
    20110303
    20110304
    $> diff temp1.txt temp2.txt > temp.diff
    $> cat temp.diff
    1,2d0
    < 20110224
    < 20110225
    5a4,5
    > 20110303
    > 20110304
    # 使用temp.diff和temp1.txt恢復temp2文件
    $> patch -i temp.diff -o temp2_restore.txt temp1.txt
    Looks like a normal diff.
    done
    # 完成后temp2_restore和原temp2文件內容一致
    $> cat temp2_restore.txt
    20110228
    20110301
    20110302
    20110303
    20110304
    posted @ 2016-03-24 12:09 xzc 閱讀(1073) | 評論 (1)編輯 收藏
    status=`ftp -v -n $ip<<END_SCRIPT
    user $name $code
    binary
    cd $remote_dir
    lcd $local_dir
    prompt
    mget *.txt
    #mdelete *.txt
    close
    bye
    END_SCRIPT`

    echo $status|grep "226 Transfer complete"
    if [ $? -eq 0 ]
    then
          echo "Connect Succeed!!!"
          exit 0
    else
          echo $status|grep "530 Login incorrect"
          if [ $? -eq 0 ]
          then
                echo "FTP Connect Error!!!"
                exit 1
          else
                echo "No data transferred!!!"
                exit 0
          fi
    fi
    posted @ 2016-03-24 12:08 xzc 閱讀(1182) | 評論 (0)編輯 收藏

    獲得當前日期+時間(date + time)函數:now()

    復制代碼
    mysql> select now();  +---------------------+ | now() | +---------------------+ | 2008-08-08 22:20:46 | +---------------------+
    復制代碼

    獲得當前日期+時間(date + time)函數:sysdate()
    sysdate() 日期時間函數跟 now() 類似,不同之處在于:now() 在執行開始時值就得到了, sysdate() 在函數執行時動態得到值。看下面的例子就明白了:

    復制代碼
    mysql> select now(), sleep(3), now();  +---------------------+----------+---------------------+ | now() | sleep(3) | now() | +---------------------+----------+---------------------+ | 2008-08-08 22:28:21 | 0 | 2008-08-08 22:28:21 | +---------------------+----------+---------------------+
    復制代碼

    sysdate() 日期時間函數,一般情況下很少用到。

     

    MySQL 獲得當前時間戳函數:current_timestamp, current_timestamp()

    復制代碼
    mysql> select current_timestamp, current_timestamp();  +---------------------+---------------------+ | current_timestamp | current_timestamp() | +---------------------+---------------------+ | 2008-08-09 23:22:24 | 2008-08-09 23:22:24 | +---------------------+---------------------+
    復制代碼

     

    MySQL 日期轉換函數、時間轉換函數

    MySQL Date/Time to Str(日期/時間轉換為字符串)函數:date_format(date,format), time_format(time,format)

    復制代碼
    mysql> select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s');  +----------------------------------------------------+ | date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') | +----------------------------------------------------+ | 20080808222301 | +----------------------------------------------------+
    復制代碼

    MySQL 日期、時間轉換函數:date_format(date,format), time_format(time,format) 能夠把一個日期/時間轉換成各種各樣的字符串格式。它是 str_to_date(str,format) 函數的 一個逆轉換。

     

    MySQL Str to Date (字符串轉換為日期)函數:str_to_date(str, format)

    select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09 select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09 select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09 select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30 select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30

    可以看到,str_to_date(str,format) 轉換函數,可以把一些雜亂無章的字符串轉換為日期格式。另外,它也可以轉換為時間。“format” 可以參看 MySQL 手冊。

     

    MySQL (日期、天數)轉換函數:to_days(date), from_days(days)

    select to_days('0000-00-00'); -- 0 select to_days('2008-08-08'); -- 733627

     

    MySQL (時間、秒)轉換函數:time_to_sec(time), sec_to_time(seconds)

    select time_to_sec('01:00:05'); -- 3605 select sec_to_time(3605); -- '01:00:05'

     

    MySQL 拼湊日期、時間函數:makdedate(year,dayofyear), maketime(hour,minute,second)

    select makedate(2001,31); -- '2001-01-31' select makedate(2001,32); -- '2001-02-01' select maketime(12,15,30); -- '12:15:30'

     

    MySQL (Unix 時間戳、日期)轉換函數

    unix_timestamp(), unix_timestamp(date), from_unixtime(unix_timestamp), from_unixtime(unix_timestamp,format)


    下面是示例:

    復制代碼
    select unix_timestamp(); -- 1218290027 select unix_timestamp('2008-08-08'); -- 1218124800 select unix_timestamp('2008-08-08 12:30:00'); -- 1218169800  select from_unixtime(1218290027); -- '2008-08-09 21:53:47' select from_unixtime(1218124800); -- '2008-08-08 00:00:00' select from_unixtime(1218169800); -- '2008-08-08 12:30:00'  select from_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008'
    復制代碼

     

     

    MySQL 日期時間計算函數

     

    MySQL 為日期增加一個時間間隔:date_add()

    復制代碼
    set @dt = now();  select date_add(@dt, interval 1 day); -- add 1 day select date_add(@dt, interval 1 hour); -- add 1 hour select date_add(@dt, interval 1 minute); -- ... select date_add(@dt, interval 1 second); select date_add(@dt, interval 1 microsecond); select date_add(@dt, interval 1 week); select date_add(@dt, interval 1 month); select date_add(@dt, interval 1 quarter); select date_add(@dt, interval 1 year);  select date_add(@dt, interval -1 day); -- sub 1 day
    復制代碼

     

    MySQL adddate(), addtime()函數,可以用 date_add() 來替代。下面是 date_add() 實現 addtime() 功能示例:

    復制代碼
    mysql> set @dt = '2008-08-09 12:12:33';  mysql> mysql> select date_add(@dt, interval '01:15:30' hour_second);  +------------------------------------------------+ | date_add(@dt, interval '01:15:30' hour_second) | +------------------------------------------------+ | 2008-08-09 13:28:03 | +------------------------------------------------+  mysql> select date_add(@dt, interval '1 01:15:30' day_second);  +-------------------------------------------------+ | date_add(@dt, interval '1 01:15:30' day_second) | +-------------------------------------------------+ | 2008-08-10 13:28:03 | +-------------------------------------------------+
    復制代碼

     

    MySQL 為日期減去一個時間間隔:date_sub()

    復制代碼
    mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);  +----------------------------------------------------------------+ | date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) | +----------------------------------------------------------------+ | 1997-12-30 22:58:59 | +----------------------------------------------------------------+
    復制代碼

    MySQL date_sub() 日期時間函數 和 date_add() 用法一致,不再贅述。

     

    MySQL 日期、時間相減函數:datediff(date1,date2), timediff(time1,time2)

    MySQL datediff(date1,date2):兩個日期相減 date1 - date2,返回天數。 select datediff('2008-08-08', '2008-08-01'); -- 7 select datediff('2008-08-01', '2008-08-08'); -- -7

    MySQL timediff(time1,time2):兩個日期相減 time1 - time2,返回 time 差值。

    select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08 select timediff('08:08:08', '00:00:00'); -- 08:08:08

    注意:timediff(time1,time2) 函數的兩個參數類型必須相同。

     

    MySQL 時間戳(timestamp)轉換、增、減函數:

    timestamp(date) -- date to timestamp timestamp(dt,time) -- dt + time timestampadd(unit,interval,datetime_expr) -- timestampdiff(unit,datetime_expr1,datetime_expr2) --

    請看示例部分:

    復制代碼
    select timestamp('2008-08-08'); -- 2008-08-08 00:00:00 select timestamp('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01 select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01  select timestampadd(day, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00 select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00  MySQL timestampadd() 函數類似于 date_add()。 select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1 select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485 select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12  select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7
    復制代碼

    MySQL timestampdiff() 函數就比 datediff() 功能強多了,datediff() 只能計算兩個日期(date)之間相差的天數。

     

    MySQL 時區(timezone)轉換函數

    convert_tz(dt,from_tz,to_tz)  select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

    時區轉換也可以通過 date_add, date_sub, timestampadd 來實現。

    select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00 select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00 select timestampadd(hour, -8, '2008-08-08 12:00:00'); -- 2008-08-08 04:00:00

     

    更多參考 http://www.cnblogs.com/she27/archive/2009/01/16/1377089.html

    posted @ 2016-02-22 14:46 xzc 閱讀(368) | 評論 (1)編輯 收藏
    [轉載]http://www.tkk7.com/hongqiang/archive/2012/07/12/382939.html
    假如你要在linux下刪除大量文件,比如100萬、1000萬,像/var/spool/clientmqueue/的mail郵件, 
    像/usr/local/nginx/proxy_temp的nginx緩存等,那么rm -rf *可能就不好使了。 
    rsync提供了一些跟刪除相關的參數 
    rsync --help | grep delete 
         --del                   an alias for --delete-during 
         --delete                delete files that don't exist on the sending side 
         --delete-before         receiver deletes before transfer (default) 
         --delete-during         receiver deletes during transfer, not before 
         --delete-after          receiver deletes after transfer, not before 
         --delete-excluded       also delete excluded files on the receiving side 
         --ignore-errors         delete even if there are I/O errors 
         --max-delete=NUM        don't delete more than NUM files 
    其中--delete-before    接收者在傳輸之前進行刪除操作 
    可以用來清空目錄或文件,如下: 
    1、先建立一個空目錄 
    mkdir /data/blank 
    2、用rsync刪除目標目錄 
    rsync --delete-before -d /data/blank/ /var/spool/clientmqueue/ 
    這樣目標目錄很快就被清空了 
    又假如你有一些特別大的文件要刪除,比如nohup.out這樣的實時更新的文件,動輒都是幾十個G上百G的,也可 
    以用rsync來清空大文件,而且效率比較高 
    1、創建空文件 
    touch /data/blank.txt 
    2、用rsync清空文件 
    rsync -a --delete-before --progress --stats /root/blank.txt /root/nohup.out 
    building file list ... 
    1 file to consider 
    blank.txt 
               0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1) 
    Number of files: 1 
    Number of files transferred: 1 
    Total file size: 0 bytes 
    Total transferred file size: 0 bytes 
    Literal data: 0 bytes 
    Matched data: 0 bytes 
    File list size: 27 
    File list generation time: 0.006 seconds 
    File list transfer time: 0.000 seconds 
    Total bytes sent: 73 
    Total bytes received: 31 
    sent 73 bytes  received 31 bytes  208.00 bytes/sec 
    total size is 0  speedup is 0.00 
    tips: 
    當SRC和DEST文件性質不一致時將會報錯 
    當SRC和DEST性質都為文件【f】時,意思是清空文件內容而不是刪除文件 
    當SRC和DEST性質都為目錄【d】時,意思是刪除該目錄下的所有文件,使其變為空目錄 
    最重要的是,它的處理速度相當快,處理幾個G的文件也就是秒級的事 
    最核心的內容是:rsync實際上用的就是替換原理 
    另外一種方式:利用xagr與ls結合
    ls | xargs -n 20 rm -fr
    ls當然是輸出所有的文件名(用空格分割)
    xargs就是將ls的輸出,每20個為一組(以空格為分隔符),作為rm -rf的參數
    也就是說將所有文件名20個為一組,由rm -rf刪除,這樣就不會超過命令行的長度了
    posted @ 2016-02-14 11:05 xzc 閱讀(361) | 評論 (1)編輯 收藏

    Cloudera Manager分析

    目錄

    1. 相關目錄

    2. 配置

    3. 數據庫

    4. CM結構

    5. 升級

    6. 卸載

    7. 開啟postgresql遠程訪問

    1. 相關目錄

    • /var/log/cloudera-scm-installer : 安裝日志目錄。
    • /var/log/* : 相關日志文件(相關服務的及CM的)。
    • /usr/share/cmf/ : 程序安裝目錄。
    • /usr/lib64/cmf/ : Agent程序代碼。
    • /var/lib/cloudera-scm-server-db/data : 內嵌數據庫目錄。
    • /usr/bin/postgres : 內嵌數據庫程序。
    • /etc/cloudera-scm-agent/ : agent的配置目錄。
    • /etc/cloudera-scm-server/ : server的配置目錄。
    • /opt/cloudera/parcels/ : Hadoop相關服務安裝目錄。
    • /opt/cloudera/parcel-repo/ : 下載的服務軟件包數據,數據格式為parcels。
    • /opt/cloudera/parcel-cache/ : 下載的服務軟件包緩存數據。
    • /etc/hadoop/* : 客戶端配置文件目錄。

    2. 配置

    • Hadoop配置文件

      配置文件放置于/var/run/cloudera-scm-agent/process/目錄下。如:/var/run/cloudera-scm-agent/process/193-hdfs-NAMENODE/core-site.xml。這些配置文件是通過Cloudera Manager啟動相應服務(如HDFS)時生成的,內容從數據庫中獲得(即通過界面配置的參數)。

      在CM界面上更改配置是不會立即反映到配置文件中,這些信息會存儲于數據庫中,等下次重啟服務時才會生成配置文件。且每次啟動時都會產生新的配置文件。

      CM Server主要數據庫為scm基中放置配置的數據表為configs。里面包含了服務的配置信息,每一次配置的更改會把當前頁面的所有配置內容添加到數據庫中,以此保存配置修改歷史。

      scm數據庫被配置成只能從localhost訪問,如果需要從外部連接此數據庫,修改vim /var/lib/cloudera-scm-server-db/data/pg_hba.conf文件,之后重啟數據庫。運行數據庫的用戶為cloudera-scm。

    • 查看配置內容

      1. 直接查詢scm數據庫的configs數據表的內容。
      2. 訪問REST API: http://hostname:7180/api/v4/cm/deployment,返回JSON格式部署配置信息。
    • 配置生成方式

      CM為每個服務進程生成獨立的配置目錄(文件)。所有配置統一在服務端查詢數據庫生成(因為scm數據庫只能在localhost下訪問)生成配置文件,再由agent通過網絡下載包含配置文件的zip包到本地解壓到指定的目錄。

    • 配置修改

      CM對于需要修改的配置預先定義,對于沒有預先定義的配置,則通過在高級配置項中使用xml配置片段的方式進行配置。而對于/etc/hadoop/下的配置文件是客戶端的配置,可以在CM通過部署客戶端生成客戶端配置。

    3. 數據庫

    Cloudera manager主要的數據庫為scm,存儲Cloudera manager運行所需要的信息:配置,主機,用戶等。

    4. CM結構

    CM分為Server與Agent兩部分及數據庫(自帶更改過的嵌入Postgresql)。它主要做三件事件:

    1. 管理監控集群主機。
    2. 統一管理配置。
    3. 管理維護Hadoop平臺系統。

    實現采用C/S結構,Agent為客戶端負責執行服務端發來的命令,執行方式一般為使用python調用相應的服務shell腳本。Server端為Java REST服務,提供REST API,Web管理端通過REST API調用Server端功能,Web界面使用富客戶端技術(Knockout)。

    1. Server端主體使用Java實現。
    2. Agent端主體使用Python, 服務的啟動通過調用相應的shell腳本進行啟動,如果啟動失敗會重復4次調用啟動腳本。
    3. Agent與Server保持心跳,使用Thrift RPC框架。

    5. 升級

    在CM中可以通過界面向導升級相關服務。升級過程為三步:

    1. 下載服務軟件包。
    2. 把所下載的服務軟件包分發到集群中受管的機器上。
    3. 安裝服務軟件包,使用軟鏈接的方式把服務程序目錄鏈接到新安裝的軟件包目錄上。

    6. 卸載

    sudo /usr/share/cmf/uninstall-scm-express.sh, 然后刪除/var/lib/cloudera-scm-server-db/目錄,不然下次安裝可能不成功。

    7. 開啟postgresql遠程訪問

    CM內嵌數據庫被配置成只能從localhost訪問,如果需要從外部查看數據,數據修改vim /var/lib/cloudera-scm-server-db/data/pg_hba.conf文件,之后重啟數據庫。運行數據庫的用戶為cloudera-scm。

    posted @ 2015-12-25 17:28 xzc 閱讀(435) | 評論 (0)編輯 收藏

    除了在一個目錄結構下查找文件這種基本的操作,你還可以用find命令實現一些實用的操作,使你的命令行之旅更加簡易。

    本文將介紹15種無論是于新手還是老鳥都非常有用的Linux find命令。

    首先,在你的home目錄下面創建下面的空文件,來測試下面的find命令示例。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # vim create_sample_files.sh
    touch MybashProgram.sh
    touch mycprogram.c
    touch MyCProgram.c
    touch Program.c
    mkdir backup
    cd backup
    touch MybashProgram.sh
    touch mycprogram.c
    touch MyCProgram.c
    touch Program.c
    # chmod +x create_sample_files.sh
    # ./create_sample_files.sh
    # ls -R
    .:
    backup                  MybashProgram.sh  MyCProgram.c
    create_sample_files.sh  mycprogram.c      Program.c
    ./backup:
    MybashProgram.sh  mycprogram.c  MyCProgram.c  Program.c

    1. 用文件名查找文件

    這是find命令的一個基本用法。下面的例子展示了用MyCProgram.c作為查找名在當前目錄及其子目錄中查找文件的方法。

    1
    2
    3
    # find -name "MyCProgram.c"
    ./backup/MyCProgram.c
    ./MyCProgram.c

    2.用文件名查找文件,忽略大小寫

    這是find命令的一個基本用法。下面的例子展示了用MyCProgram.c作為查找名在當前目錄及其子目錄中查找文件的方法,忽略了大小寫。

    1
    2
    3
    4
    5
    # find -iname "MyCProgram.c"
    ./mycprogram.c
    ./backup/mycprogram.c
    ./backup/MyCProgram.c
    ./MyCProgram.c

     

    3. 使用mindepth和maxdepth限定搜索指定目錄的深度

    在root目錄及其子目錄下查找passwd文件。

    1
    2
    3
    4
    5
    # find / -name passwd
    ./usr/share/doc/nss_ldap-253/pam.d/passwd
    ./usr/bin/passwd
    ./etc/pam.d/passwd
    ./etc/passwd

    在root目錄及其1層深的子目錄中查找passwd. (例如root — level 1, and one sub-directory — level 2)

    1
    2
    # find -maxdepth 2 -name passwd
    ./etc/passwd

    在root目錄下及其最大兩層深度的子目錄中查找passwd文件. (例如 root — level 1, and two sub-directories — level 2 and 3 )

    1
    2
    3
    4
    # find / -maxdepth 3 -name passwd
    ./usr/bin/passwd
    ./etc/pam.d/passwd
    ./etc/passwd

    在第二層子目錄和第四層子目錄之間查找passwd文件。

    1
    2
    3
    # find -mindepth 3 -maxdepth 5 -name passwd
    ./usr/bin/passwd
    ./etc/pam.d/passwd

    4. 在find命令查找到的文件上執行命令

    下面的例子展示了find命令來計算所有不區分大小寫的文件名為“MyCProgram.c”的文件的MD5驗證和。{}將會被當前文件名取代。

    1
    2
    3
    4
    5
    find -iname "MyCProgram.c" -exec md5sum {} \;
    d41d8cd98f00b204e9800998ecf8427e  ./mycprogram.c
    d41d8cd98f00b204e9800998ecf8427e  ./backup/mycprogram.c
    d41d8cd98f00b204e9800998ecf8427e  ./backup/MyCProgram.c
    d41d8cd98f00b204e9800998ecf8427e  ./MyCProgram.c

    5. 相反匹配

    顯示所有的名字不是MyCProgram.c的文件或者目錄。由于maxdepth是1,所以只會顯示當前目錄下的文件和目錄。

    1
    2
    3
    4
    5
    6
    find -maxdepth 1 -not -iname "MyCProgram.c"
    .
    ./MybashProgram.sh
    ./create_sample_files.sh
    ./backup
    ./Program.c

    6. 使用inode編號查找文件

    任何一個文件都有一個獨一無二的inode編號,借此我們可以區分文件。創建兩個名字相似的文件,例如一個有空格結尾,一個沒有。

    1
    2
    3
    4
    5
    6
    touch "test-file-name"
    # touch "test-file-name "
    [Note: There is a space at the end]
    # ls -1 test*
    test-file-name
    test-file-name

    從ls的輸出不能區分哪個文件有空格結尾。使用選項-i,可以看到文件的inode編號,借此可以區分這兩個文件。

    1
    2
    3
    ls -i1 test*
    16187429 test-file-name
    16187430 test-file-name

    你可以如下面所示在find命令中指定inode編號。在此,find命令用inode編號重命名了一個文件。

    1
    2
    3
    4
    5
    find -inum 16187430 -exec mv {} new-test-file-name \;
     
     # ls -i1 *test*
    16187430 new-test-file-name
    16187429 test-file-name

    你可以在你想對那些像上面一樣的糟糕命名的文件做某些操作時使用這一技術。例如,名為file?.txt的文件名字中有一個特殊字符。若你想執行“rm file?.txt”,下面所示的所有三個文件都會被刪除。所以,采用下面的步驟來刪除”file?.txt”文件。

    1
    2
    ls
    file1.txt  file2.txt  file?.txt

    找到每一個文件的inode編號。

    1
    2
    3
    4
    ls -i1
    804178 file1.txt
    804179 file2.txt
    804180 file?.txt

    如下所示:?使用inode編號來刪除那些具有特殊符號的文件名。

    1
    2
    3
    4
    find -inum 804180 -exec rm {} \;
    # ls
    file1.txt  file2.txt
    [Note: The file with name "file?.txt" is now removed]

    7. 根據文件權限查找文件

    下面的操作時合理的:

    • 找到具有指定權限的文件
    • 忽略其他權限位,檢查是否和指定權限匹配
    • 根據給定的八進制/符號表達的權限搜索

    此例中,假設目錄包含以下文件。注意這些文件的權限不同。

    1
    2
    3
    4
    5
    6
    7
    8
    ls -l
    total 0
    -rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all
    -rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read
    ---------- 1 root root 0 2009-02-19 20:31 no_for_all
    -rw------- 1 root root 0 2009-02-19 20:29 ordinary_file
    -rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read
    ----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read

    找到具有組讀權限的文件。使用下面的命令來找到當前目錄下對同組用戶具有讀權限的文件,忽略該文件的其他權限。

    1
    2
    3
    4
    5
    find . -perm -g=r -type f -exec ls -l {} \;
    -rw-r--r-- 1 root root 0 2009-02-19 20:30 ./everybody_read
    -rwxrwxrwx 1 root root 0 2009-02-19 20:31 ./all_for_all
    ----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read
    -rw-r----- 1 root root 0 2009-02-19 20:27 ./others_can_also_read

    找到對組用戶具有只讀權限的文件。

    1
    2
    find . -perm g=r -type f -exec ls -l {} \;
    ----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read

    找到對組用戶具有只讀權限的文件(使用八進制權限形式)。

    1
    2
    find . -perm 040 -type f -exec ls -l {} \;
    ----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read

    8. 找到home目錄及子目錄下所有的空文件(0字節文件)

    下面命令的輸出文件絕大多數都是鎖定文件盒其他程序創建的place hoders

    1
    find ~ -empty

    只列出你home目錄里的空文件。

    1
    find . -maxdepth 1 -empty

    只列出當年目錄下的非隱藏空文件。

    1
    find . -maxdepth 1 -empty -not -name ".*"

    9. 查找5個最大的文件

    下面的命令列出當前目錄及子目錄下的5個最大的文件。這會需要一點時間,取決于命令需要處理的文件數量。

    1
    find . -type f -exec ls -s {} \; | sort -n -r | head -5

    10. 查找5個最小的文件

    方法同查找5個最大的文件類似,區別只是sort的順序是降序。

    1
    find . -type f -exec ls -s {} \; | sort -n  | head -5

    上面的命令中,很可能你看到的只是空文件(0字節文件)。如此,你可以使用下面的命令列出最小的文件,而不是0字節文件。

    1
    find . -not -empty -type f -exec ls -s {} \; | sort -n  | head -5

    11. 使用-type查找指定文件類型的文件

    只查找socket文件

    1
    find . -type s

    查找所有的目錄

    1
    find . -type d

    查找所有的一般文件

    1
    find . -type f

    查找所有的隱藏文件

    1
    find . -type f -name ".*"

    查找所有的隱藏目錄

    1
    find -type d -name ".*"

    12. 通過和其他文件比較修改時間查找文件

    顯示在指定文件之后做出修改的文件。下面的find命令將顯示所有的在ordinary_file之后創建修改的文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ls -lrt
    total 0
    -rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read
    ----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read
    -rw------- 1 root root 0 2009-02-19 20:29 ordinary_file
    -rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read
    -rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all
    ---------- 1 root root 0 2009-02-19 20:31 no_for_all
     
    # find -newer ordinary_file
    .
    ./everybody_read
    ./all_for_all
    ./no_for_all

    13. 通過文件大小查找文件

    使用-size選項可以通過文件大小查找文件。

    查找比指定文件大的文件

    1
    find ~ -size +100M

    查找比指定文件小的文件

    1
    find ~ -size -100M

    查找符合給定大小的文件

    1
    find ~ -size 100M

    注意: – 指比給定尺寸小,+ 指比給定尺寸大。沒有符號代表和給定尺寸完全一樣大。

    14. 給常用find操作取別名

    若你發現有些東西很有用,你可以給他取別名。并且在任何你希望的地方執行。

    常用的刪除a.out文件。

    1
    2
    alias rmao="find . -iname a.out -exec rm {} \;"
    # rmao

    刪除c程序產生的core文件。

    1
    2
    alias rmc="find . -iname core -exec rm {} \;"
    # rmc

    15. 用find命令刪除大型打包文件

    下面的命令刪除大于100M的*.zip文件。

    1
    find / -type f -name *.zip -size +100M -exec rm -i {} \;"

    用別名rm100m刪除所有大雨100M的*.tar文件。使用同樣的思想可以創建rm1g,rm2g,rm5g的一類別名來刪除所有大于1G,2G,5G的文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    alias rm100m="find / -type f -name *.tar -size +100M -exec rm -i {} \;"
    # alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} \;"
    # alias rm2g="find / -type f -name *.tar -size +2G -exec rm -i {} \;"
    # alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} \;"
     
    # rm100m
    # rm1g
    # rm2g
    # rm5g

    Find命令示例(第二部分)

    若你喜歡這篇關于find命令的Mommy文章,別忘了看看第二部分的關于find命令的Daddy文章。《爹地,我找到了!15個極好的Linux find命令示例

    posted @ 2015-12-23 10:34 xzc 閱讀(414) | 評論 (3)編輯 收藏
    僅列出標題
    共32頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    主站蜘蛛池模板: 精品亚洲国产成人av| 日韩免费观看的一级毛片| 国产成人亚洲午夜电影| 亚洲毛片在线免费观看| 亚洲线精品一区二区三区影音先锋 | 久久精品亚洲中文字幕无码网站| 成全高清视频免费观看| 蜜桃成人无码区免费视频网站| 日产久久强奸免费的看| 亚洲国产精品日韩av不卡在线| 亚洲另类古典武侠| 99亚洲精品高清一二区| 亚洲国产精品无码久久久秋霞2 | 免费观看四虎精品成人| 亚洲国产成人无码AV在线影院| 亚洲一区在线视频| 亚洲国产美女精品久久久久| 亚洲毛片在线观看| 亚洲AV无码一区二区乱子伦| 亚洲人成无码网站| 亚洲国产另类久久久精品小说 | 美女视频黄.免费网址| 亚洲乱理伦片在线观看中字| 亚洲色大成网站www| 亚洲 欧洲 视频 伦小说| 亚洲国产精品综合久久2007| 亚洲国产美女福利直播秀一区二区 | 亚洲成年网站在线观看| 亚洲Av无码一区二区二三区| 亚洲国产片在线观看| 亚洲国产精品成人精品小说| 亚洲日韩乱码中文无码蜜桃臀| 亚洲欧洲国产综合| 精品久久久久久亚洲精品| 亚洲乱码在线观看| 亚洲av日韩av永久无码电影| 老司机午夜在线视频免费观| 和老外3p爽粗大免费视频| 暖暖在线视频免费视频| 蜜臀AV免费一区二区三区| 在线视频免费观看高清|