1. 程式人生 > 其它 >shell 學習筆記(18)

shell 學習筆記(18)

宣告:轉載需署名出處,嚴禁用於商業用途!

1701.大量連線處於 TIME_WAIT 狀態的解決方法:
    netstat -nt 看到大量 TIME_WAIT
    dmesg 看到 time wait bucket table overflow
    解決辦法:1、 /proc/sys/net/ipv4/tcp_max_tw_buckets 過小了,設成540000以上
              2、 /sys/module/ip_conntrack/parameters/hashsize 過小了,
                  設成/proc/sys/net/ipv4/netfilter/ip_conntrack_count這個值的1/4大小較為合適
1702.編譯php出錯:error while loading shared libraries: libmysqlclient.so.18: cannot open shared object:
    ln -s /usr/local/mysql/lib/libmysqlclient.so.18  /usr/lib/
    照做後仍然報錯,原因是該方法適用於32位系統,64位系統應使用下面的這行
    ln -s /usr/local/mysql/lib/libmysqlclient.so.18  /usr/lib64/
    另外:在編譯的時候,不寫mysql的路徑,而使用mysqld代替,也可解決該問題的出現。
1703.shell列印當前行號:
    echo "$LINENO"
    顯示函式在哪一行被呼叫的:
    line(){
        echo call by line `caller 0 | awk '{print$1}'`
    }
    line
1704.當系統swap空間所剩不多時,可通過在本地磁碟上建立普通檔案作為swap :
    dd一個檔案,然後mkswap,然後swapon
    dd if=/dev/zero  of=./swapfile bs=1M count=1000
    mkswap ./swapfile
    swapon ./swapfile  
    即可為系統臨時增加1G的swap。
    使用完畢後執行:
    swapoff ./swapfile
    rm -f swapfile
1705.多行結果賦值給變數:用引號防止 shell 做 word split:
    file=`find . -name "*"`
    echo "$file"
1706.wireshark 八進位制編碼問題:
    google.com/search?q=淘寶網     這個http請求,抓包裡面對應的內容是
    GET /search?q=314324261246315370 HTTP/1.1rn
    314324261246315370這一段對應的是淘寶網3個字,應該是gbk,gbk是每個漢子兩個 
    nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
    8進位制,轉換成十六進位制看看,再看編碼 
    CC D4對應314324     echo 0:ccd4|xxd -r|iconv -f gbk -t utf-8
    echo $'314324261246315370'|iconv -f gbk -t utf-8
    前面要加$,這樣是表示8進位制的  
1707.sort -n -g 按數字排序的區別:
    -g 通用數值排序,-n 數值排序。
    -g 支援的記數方法比 -n 廣,-g 使用標準 C 函式 strtod 來轉換數值,支援科學記數法,如 1.0e-34,
    不過 -g 比 -n 慢得多。詳細區別參考info sort文件或者stackoverflow.com。
1708.關於sort -h排序問題:
    echo "2025K
    1M
    1G"|sort -h        # du、ls、df 等能保證輸出一定是k<m<g的格式,不會存在2025k這種形式的。
1709.使用 cURL 測試 Web 站點的響應時間:
    curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://www.canada.com
1710.設定使用者的程序數限制:
    /etc/security/limits.conf
    /etc/profile裡面寫ulimit -n 65535,只有root才能增加,這樣其它使用者登入都會報錯。
    nofile 是開啟檔案數,nproc是程序數,soft 指的是當前系統生效的設定值。hard 表明系統中所能設定的最大值。
    soft 的限制不能比hard 限制高。用 - 就表明同時設定了 soft 和 hard 的值
1711.ssh不輸出連線資訊:
    ssh -t 會輸出一個或者 ssh 加 -q 引數  或者 2>/dev/null 遮蔽掉
1712.wget將頁面內容輸出到標準輸出:
    wget -qO- http://shushu.com.cn/tm.php        # -qO- 相當於 -q  -O -
1713.iptables埠轉發:將本地80埠的請求轉發到8080埠,當前主機ip為192.168.2.1
    iptables -t nat -A PREROUTING -d 192.168.2.1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:8080
    ssh 或者 haproxy 之類的也可以做埠對映
1714.程序間通訊方式:
    PIPE(FIFO)    
    訊息佇列        
    訊號量(Semaphore)        
    共享儲存        
    SOCKET    
1715.執行緒間通訊常用的三種方法:
    1.全域性變數
        程序中的執行緒間記憶體共享,這是比較常用的通訊方式和互動方式。
        注:定義全域性變數時最好使用volatile來定義,以防編譯器對此變數進行優化。
    2.Message訊息機制(windows下)
        常用的Message通訊的介面主要有兩個:PostMessage和PostThreadMessage執行緒常常要將資料傳遞給另外一個執行緒。
        Worker執行緒可能需要告訴別人說它的工作完成了,GUI執行緒則可能需要交給Worker執行緒一件新的工作。
    3.CEvent物件(windows下)
        CEvent為MFC中的一個物件,可以通過對CEvent的觸發狀態進行改變,從而實現執行緒間的通訊和同步。
1716.本機免key登入:
    ssh-keygen -t dsa -f ~/.ssh/id_dsa
    cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
1717.curl抓取http返回碼:
    curl -so /dev/null -w '%{http_code}n' www.sina.com
1718.ssh -D 一句話代理:
    alias proxy='expect -c "spawn ssh -D 127.0.0.1:6789 67.205.5.88 -l username;expect *password* ;send -- "passwordr" ;  expect eof"'
    alias proxy='expect -c "spawn ssh -D 127.0.0.1:6789 67.205.5.88 -l username;expect *password* ;send -- "passwordr" ;  interact"'
1719.ps -ww 不限制寬度輸出:結果也與終端有關
    09:19:48#tp#~> ps -few|wc -L
    157
    09:19:50#tp#~> ps -feww|wc -L
    1326
    09:19:52#tp#~> echo $COLUMNS
    157
1720./dev/null 被cp,許可權被修改:
    mknod -m 666 /dev/null c 1 3        # 建立特殊檔案的,比如block或者是管道檔案 
1721.每 n 個字元截斷換行的幾種方法:
    echo 123190287923849241483971837103921|sed 's/..../&n/g'
    dd cbs=4 conv=unblock;    fold -c4;grep -Eo '.{1,4}'
1722.awk輸出到管道或者檔案的時候有buffer,一般是4K,到達4K才輸出,輸出到標準輸出沒buffer
    i=0;while sleep 0.1;do echo -ne "r"$((i++));done|awk 'BEGIN{ORS=RS="r"}{print $0}'|tee a
    可以用這個測試下,如果去掉tee就可以正常顯示,或者去掉awk也可以,兩個都加上就不行,
    如果把sleep 0.1改成sleep 0.000001,到達4K的時候就會輸出了,
    用fflush()可以重新整理buffer 
1723.od進行ascii到八進位制、10進位制、16進位制的轉換:
    printf "^A" | od -An -o # -b -x -d
1724.curl測試網路狀況:
    curl -so /dev/null -w '%{http_code}' -H host:www.host.com 8.8.8.8/a.txt        #測返回碼
    curl -sH host:www.host.com 8.8.8.8/a.txt    #下載檔案測試
1725.paste -s序列合併檔案內容:
    seq 100|paste -sd '    n'        #每5個換行
    echo {1..100}|xargs -n5            #xargs -n 效率比較低
    echo {1..100}|grep -Po '(w+ ?){5}'
1726.printf列印ascii的10進位制值:
    printf '%dn' 'c        # 'c 意思就是使用字元作為數字值
    awk 列印 ascii 對應 10 進位制值:
    echo a|awk 'BEGIN{for(i=0;i<255;i++)a[sprintf("%c",i)]=i}{print a[$0]}'
    列印ascii的16進位制值:
    printf '%02x' "'+"      # echo -n '+' | od -tx1 -An | tr -d ' '
1727.- 表示標準輸入或者標準輸出,用法舉例:
    tar cvf - * | (cd  /dest/dir && tar xvfp -)            # - 需要程式自己支援,例如tar、cat,-可以理解為臨時檔案形式存在
    -在命令符當中表示標準輸入或者標準輸出。
    在tar cvf - *當中,表示標準輸出,因為f引數後面跟的是輸出的,
    這個命令的意思就是把當前目錄的所有檔案,tar打包到標準輸出當中
    然後通過管道,這個命令的標準輸出作為後面 (cd  /dest/dir && tar xvfp -)
    命令的標準輸入,cd /dest/dir沒有什麼好說的,切換到那個目錄。
    然後tar xvfp表示解壓縮檔案,但是沒有指明是那個具體的檔案?所以就是-了,
    表示標準輸入當中獲取檔案,然後解壓縮到噹噹前目錄。
    總體來看,這個命令就是拷貝檔案了。
1728.sub()與match()的搭配使用,可逐次取出原字串中合乎指定條件的所有子字串:
    awk 'BEGIN {
        data = "p12-P34 P56-p61"
        while( match( data ,/[0-9]+/) >0) {
           print substr(data,RSTART, RLENGTH)
           sub(/[0-9]+/,"",data)
        }
    }'        #類似python re中的group或者正則中的捕獲組
1729.巧用find的內建命令:delete、ls等:
    find -name "AAA" -ls    #同時減少了-exec執行fork帶來的開銷。
    find  . -name  AAA  ( -type f -exec ls -l {} ; -o -type d -exec ls -ld {} ; )
1730.顯示所有 ipv4:
    ip -o -4 a s
1731.printf -v 直接賦值變數:
    printf -v var '%%%02x' 111
1732.awk  FIELDWIDTHS 將字串按指定域寬度劃分:
    echo '23456.23478.58924.6' | awk -vFIELDWIDTHS="3 6 5 5" -vOFS="t" '{$1=$1;print}'
    echo ${A:0:3} ${A:3:6} ${A:9:5} ${A:14:5} 
1733.檢視 tcp 連線中 keepalive 的數量:
    netstat -town
1734.模擬骰子產生1~6的隨機數:
    echo $((0x$(head -c5 /dev/random|xxd -ps)%6+1))
1735.pkill殺程序是模糊匹配,小心誤殺:
    pkill aaa ,所有程序名裡包含aaa的都會被幹掉
    你可以用pgrep看看,程序名,不包含引數,你還可以指定tty、使用者名稱什麼的  
    如果要精確匹配:pgrep -lx 類似 grep 的 -x 按行匹配
    -f 是不僅僅在程序裡面查,引數也會查 ,就是你pkill -f apache,會把java -u apache也殺掉。預設是隻看程序名是否匹配 
    pgrep -fl 99
    27659 sleep 99
    -fx 是完整匹配整個命令列(程序名+引數) ,-x 是完整匹配程序名 
1736.pkill 踢出who裡的登入終端或者ip:
    pkill -kill -t pts/2
1737.得到10個字元的隨機密碼:
    tr -dc A-Za-z0-9_ < /dev/urandom | head -c 10 | xargs
1738.perl列出當前目錄下所有的符號連結:
    perl -e 'print map { -l and $_ .= "n" } <*>'
1739.nnohup退出終端會斷掉:
    shopt |grep huponexit
    grep -iR hup .bashrc .profile /etc/bash* /etc/profile*找下,反正我這沒有,我是off
    預設值都是off的,開了就會出現他的那種問題,shell退出不應該給這個shell的子程序發HUP訊號的,可以trap下。
1740.利用nc遠端傳輸檔案:
    tar -cf - * | nc 172.20.51.51 5555
1741.正則貪婪匹配陷阱:最左邊的貪婪匹配優先順序最高,後面的匹配都是基於正則的回溯機制,所以後面的都屬於非貪婪匹配了。
    *雖然貪婪,但也可能發空匹配,因為他可以為0,而+至少匹配一次,限制較強。
    echo "房屋資訊        房屋資訊        1--district     190_360"|sed -r 's/(.*)([0-9]+)_([0-9]+)/=1==2===3/'
    =房屋資訊        房屋資訊        1--district     19==0===360
    echo "房屋資訊        房屋資訊        1--district     190_360"|sed -r 's/(.*)([0-9]*)_([0-9]*)/=1==2===3/'
    =房屋資訊        房屋資訊        1--district     190=====360
    echo "房屋資訊        房屋資訊        1--district     190_360"|sed -r 's/(.+)([0-9]+)_([0-9]*)/=1==2===3/'
    =房屋資訊        房屋資訊        1--district     19==0===360
    echo "房屋資訊        房屋資訊        1--district     190_360"|sed -r 's/(.*) ([0-9]+)_([0-9]*)/=1==2===3/'
    =房屋資訊        房屋資訊        1--district    ==190===360
1742.rsync -b 更新前先備份:
    rsync -b,然後--suffix指定字尾或者--backup-dir指定備份的目錄,mv肯定比cp快,rsync的-b也是mv的 
1743.windows下查詢域名對應的所有伺服器:
    nslookup -qt=mx web.qq.com
1744.vi一個遠端檔案:
    vi scp://username@host//path/to/somefile        #注意雙斜線
1745.刪除所有非列印字元:
    tr -dc '[:print:]' < filename
1746.PS1 設定putty等ssh工具的標籤頁 title:
    PS1='u@h:w$ '
    # If this is an xterm set the title to user@host:dir
    case "$TERM" in
        xterm*|rxvt*)
            PS1="[e]0;u@h: wa]$PS1"
            ;;
        *)
            ;;
    esac
    或者:
    PROMPT_COMMAND='echo -ne "