shell 学习笔记(18)
生活随笔
收集整理的這篇文章主要介紹了
shell 学习笔记(18)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
聲明:轉載需署名出處,嚴禁用于商業用途!?
1701.大量連接處于 TIME_WAIT 狀態的解決方法:netstat -nt 看到大量 TIME_WAITdmesg 看到 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,然后swapondd if=/dev/zero of=./swapfile bs=1M count=1000mkswap ./swapfileswapon ./swapfile 即可為系統臨時增加1G的swap。使用完畢后執行:swapoff ./swapfilerm -f swapfile 1705.多行結果賦值給變量:用引號防止 shell 做 word split:file=`find . -name "*"`echo "$file" 1706.wireshark 八進制編碼問題:google.com/search?q=淘寶網 這個http請求,抓包里面對應的內容是GET /search?q=\314\324\261\246\315\370 HTTP/1.1\r\n\314\324\261\246\315\370這一段對應的是淘寶網3個字,應該是gbk,gbk是每個漢子兩個 \nnn the eight-bit character whose value is the octal value nnn (one to three digits)8進制,轉換成十六進制看看,再看編碼 CC D4對應\314\324 echo 0:ccd4|xxd -r|iconv -f gbk -t utf-8echo $'\314\324\261\246\315\370'|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 "2025K1M1G"|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.1iptables -t nat -A PREROUTING -d 192.168.2.1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:8080ssh 或者 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_dsacat ~/.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 -- \"password\r\" ; expect eof"'alias proxy='expect -c "spawn ssh -D 127.0.0.1:6789 67.205.5.88 -l username;expect *password* ;send -- \"password\r\" ; interact"' 1719.ps -ww 不限制寬度輸出:結果也與終端有關09:19:48#tp#~> ps -few|wc -L15709:19:50#tp#~> ps -feww|wc -L132609:19:52#tp#~> echo $COLUMNS157 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才輸出,輸出到標準輸出沒bufferi=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 '%d\n' \'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 9927659 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 huponexitgrep -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===360echo "房屋信息 房屋信息 1--district 190_360"|sed -r 's/(.*)([0-9]*)_([0-9]*)/=\1==\2===\3/'=房屋信息 房屋信息 1--district 190=====360echo "房屋信息 房屋信息 1--district 190_360"|sed -r 's/(.+)([0-9]+)_([0-9]*)/=\1==\2===\3/'=房屋信息 房屋信息 1--district 19==0===360echo "房屋信息 房屋信息 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:dircase "$TERM" inxterm*|rxvt*)PS1="\[\e]0;\u@\h: \w\a\]$PS1";;*);;esac或者:PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD}"; echo -ne "\007"' 1747.tail -f 管道的buffer不能實時輸出的問題:unbuffer -p tail -f .sh_histoy |awk '{print $0}' 1748.利用 bc 計算器 obase 參數,實現十進制轉二進制:echo 'obase=2;98'|bc 1749.為 man 指定閱讀器 pager :less,并搜索指定字符串 034PAGER='less -iRsp034' man ascii 1750.vim中獲取只讀文件的sudo權限寫入::w !sudo tee %命令:w !{cmd},讓 vim 執行一個外部命令{cmd},然后把當前緩沖區的內容從 stdin 傳入。tee 是一個把 stdin 保存到文件的小工具。而 %,是vim當中一個只讀寄存器的名字,總保存著當前編輯文件的文件路徑。所以執行這個命令,就相當于從vim外部修改了當前編輯的文件,然后從定向到當前文件。%! sudo tee % > /dev/null% #VI/VIM編輯的文件內容! #管道sudo #以root權限操作tee #% #VI/VIM編輯的文件> /dev/null #這里可省略 1751.查看linux版本的幾種方法:cat /proc/version; uname -a; lsb_release -a; cat /etc/issue; cat /etc/redhat-release; rpm -q redhat-releasefile /bin/bash; file /bin/cat 1752.ls --time-style自定義時間格式顯示:ls -lth --time-style=+"%F %T" 1753.去除vi打開文件時帶的顏色及控制亂碼字符:col -b 1754.sh 雖然鏈接到了 /bin/bash,但是 /bin/sh 執行效果不完全等同 /bin/bash,而是 /bin/bash --posix有很多系統里 gzip gunzip zcat 都指向一個inode, 同一程序對不同加載名作不同動作的用法在*nix中太常見了 1755.正則捕獲示例:抓取網頁上的 URL 鏈接:注意設置 LC_ALL 語言環境和字符集curl -s www.58.com.cn | sed -rn "s#.*(http://[0-9A-Za-z]*\.[^/\"?' ]*).*#\1#p"|sort|uniq -c|sort -k1rncurl -s www.qq.com | LC_ALL=C sed -rn "s#.*(http://\w*\.[[:alnum:].]*).*#\1#p"|sort|uniq -c|sort -k1rn上面的 sed 有一行上不能匹配多個網址的 bug,因為sed需要完全匹配后才能print,下面用 grep 修復該問題curl -s www.360buy.com | grep -Po '(https?://\w*\.[[:alnum:].]*)' |sort|uniq -c|sort -k1rn注:posix 字符類 [[:alnum:]] 等價于 [0-9A-Za-z],\w 為 [[:alnum:]_]的同義詞,指單詞字符,相當于 [0-9A-Za-z_],關于這點 man grep \w 中有前后矛盾的描述。 1756.sed單引號轉義問題:sed單引號轉義只支持16進制 \x27, 而且外層一定要加單引號或者雙引號引起來:echo "1'1"|sed -r 's/\x27//' # 不加引號那shell 會解釋\x 成為 x,所以要養成加引號的習慣不支持8進制:echo "1'1"|sed -r 's/\047//' ,而 awk 是兩者都支持的。或者sed中用 "'" 表示單引號 1757.用 bc -l 加載數學庫做小數計算:echo 2/70|bc -l # echo 2/70|awk '{printf "%f", 2/70}' 1758.locale 字符集語言環境的設置:echo http://wwAw.HA~12o.com|LC_ALL=C sed -rn "s#.*(http://([a-z]*)\.[^/\"?' ]*).*#\2#p"echo Aab|LC_ALL=C sed -r 's/[A-Z]//g' 注:有時候莫名其妙的問題一般與 LC_ALL=C 有關,C 是 POSIX,和具體語言無關。其實最好是C,這樣sort排序會快很多,還有遇到[a-z]這種情況比較安全,還有 [.-/] 這種 1759.巧用 sed // 上次匹配功能排除邊界值:echo -e "a\n2\nc"|sed '/a/,/c/{//!d}' # // 相當于awk中 !/^a|^c/ 1760.shell中轉換16進制到10進制:i=A; echo "obase=10;ibase=16;$i" | bca=99 b=e8; (( 16#a > 16#b ))&&echo "a > b"||echo 'a <= b'echo $(printf "%d" 0xD) 1761.rsync 只同步目錄(危險慎用!)"只" 同步目錄,子目錄的子目錄也可以同步,但子目錄里的文件不同步。rsync -av --delete -f '+ */' -f '- *' SRC/ DEST/ # -f '+ */'是同步目錄,-f '- *'是不同步文件。想把子目錄的內容也同步:rsync -av --delete -f '+ */' -f '- /*' SRC/ DEST/ 1762.vim 粘貼板簡介: vim 有 12個粘貼板 0、1、2、…、9、a、"、+;用:reg命令可以查看各個粘貼板里的內容。在vim中簡單用y只是復制到 " (雙引號)粘貼板里,p也這樣。Ny完成復制到N號剪貼板,其中N為粘貼板號(注意是按一下雙引號然后按粘貼板號最后按y),例如要把內容復制到粘貼板a,選中內容后按 "ay 就可以了,有兩點需要說明一下:+號粘貼板是系統粘貼板,用"+y將內容復制到該粘貼板后可以使用Ctrl+V將其粘貼到其他文檔(如firefox、gedit)中,同理,要把在其他地方用Ctrl+C或右鍵復制的內容復制到vim中,需要在正常模式下按 "+p,要將vim某個粘貼板里的內容粘貼進來,需要退出編輯模式,在正常模式按"Np,其中N為粘貼板號,如上所述,可以按"5p將5號粘貼板里的內容粘貼進來,也可以按"+p將系統全局粘貼板里的內容粘貼進來。 1763.查看本機外網 ip:curl ifconfig.me 1764.awk 處理浮點數四舍五入的問題:ieee754 http://zh.wikipedia.org/zh-cn/IEEE_754$ echo "3.445"|awk '{printf "%0.2f\n",$0}' 3.44There is no ieee754 number for 3.445000000000000000000...$ echo "3.445"|awk '{printf "%0.20f\n",$0}' 3.44499999999999984013$ echo "3.4450000000000001"|awk '{printf "%0.20f\n",$0}' 3.44500000000000028422$ echo "3.44500000000000001"|awk '{printf "%0.20f\n",$0}' 3.44499999999999984013 1765.過濾掉 /etc/passwd 中的自動生成用戶awk -F: '$0!~/nologin/&&($3=0||$3>=500)' /etc/passwd 1766.利用taskset有效控制cpu資源taskset -c 0 sh job.sh #開啟一個只用0標記的cpu核心的新進程(job.sh是你的工作腳本)taskset -pc 0 23328 #查找現有的進程號,調整該進程cpu核心使用情況可在top中進行負載check,最后你可以在你的工作腳本中加入該指令來合理利用現有的cpu資源 1767.關于 [^A-Za-z] 是否等價 [^A-z] 的問題:[^a-zA-Z] 是正則[!a-zA-Z] 是通配符用的地方不一樣,而且A-z包含幾個非字母字符,且用的時候還需要注意字符集 1768.校對大量文件的完整性:rsync 返回碼或者 find打印大小,不要用du,du與FS的block大小設置有關,異構的FS中不準確 1769.登錄linux,執行配置文件的順序:/etc/profile -> [~/.bash_profile | ~/.bash_login | ~/.profile] -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout在登錄時,首先會執行/etc/profile,其次是用戶目錄下的.bash_profile,.bash_profile不存在則讀取.bash_login,若.bash_profile和.bash_login都不存在,最后才讀取.profile 1770.wget 帶上瀏覽器 agent 下載:wget -c $url -O test2.flv -U # --user-agent=AGENT 1771.ed 是真正的 inplace editing,sed 是假的 inplace editing,中間是生成了臨時文件的。 1772.查看文件編碼的 2 種方式:file -i 文件名 # vim 中 :set fileencoding 1773.根據進程名顯示進程號: pidof java 1774.如何限制用戶的最小密碼長度:修改 /etc/login.defs 里面的PASS_MIN_LEN的值 1775.如何使新用戶首次登陸后強制修改密碼:useradd -p '' testuser; chage -d 0 testuser 1776.vi 編輯標準輸入輸出:crontab -l | vi - 1777.awk 利用協同進程監聽指定端口:awk 'BEGIN{service="/inet/tcp/2000/0/0"; service |& getline; print $0; close(service)}' 1778. awk ‘FS=”:” {print $1,$3,$6}’ 明顯不等價于 awk -F: ‘{print $1,$3,$6}’ ,前者是讀取第一行記錄并將記錄分割成字段之后才進行FS的設置,FS=”:” 作為了模式,通常這樣的寫法是錯誤的.例如 awk 'FS=":" {print $1,$3,$6}' /etc/passwd 會把第一個整行打印出來 1779.awk gensub 刪除字段及其FS:echo 1 2 3 4 5|awk '{$4="";print gensub(FS,"",4)}'echo 1 2 3 4 5|awk '{sub($4FS,"")}1'echo "1 2 3 4 5"|awk '{$4="";$0=$0;$4=$4;print}' 注意 $1=$1;$4=$4 缺一不可,否則會有殘留FS輸出,$4=$4 在重構該域時會把周圍多個 FS 合并,就像 echo 1 2 一樣 1780.設置 PS1,根據上一個命令返回狀態碼控制顯示紅色還是綠色:`[ $? -eq 0 ]||echo \[\e[31m\]` 1781.判斷程序輸入來自文件還是標準輸入:用 < 的話也是來自 - 的,不是來自文件15:18:17#tp#~> awk 'END{print FILENAME}' <a-15:18:23#tp#~> cat a|awk 'END{print FILENAME}'-15:18:58#tp#~> 1782.查看dd命令的執行進度:dd if=/dev/zero of=/data3/test bs=1k count=1024000 # a 終端執行while killall -USR1 dd; do sleep 5; done # b 終端執行然后就能看到間隔5秒一次的輸出結果了,所執行的killall命令循環會在dd命令執行結束之后退出。為什么dd命令的進度輸出要killall命令來激發呢?其實答案很簡單,dd的進度輸出就是這么設計的,再詳細點就是dd命令在執行的時候接收到SIGUSR1信號的輸出當前的讀寫進度,而killall命令在這里起的作用就是給dd進程發送這個信號。對于沒有那些不與終端交互的守護進程(Deamon Process),通常的設計是在接收到SIGHUP信號之后就會重新讀取配置文件。比如下面的:# 當你對smb.conf修改之后,運行下面的命令,修改就能生效了# 而不用再來一個smb restartkillall -HUP smbd 1783.atime、ctime、mtime 區別與聯系:atime:訪問時間(access time),指的是文件最后被讀取的時間,可以使用touch命令更改為當前時間;ctime:變更時間(change time),指的是文件屬性最后被變更的時間,變更動作可以使chmod、chgrp、mv等等;mtime:修改時間(modify time),指的是文件內容最后被修改的時間,修改動作可以使echo重定向、vi等等;ctime 變動時不影響 mtimemtime 變動時 ctime 一起變。 1784.bc中十進制、二進制互轉,ibase影響你所有的輸入,14:53:49#tp#~> echo 'ibase=10;obase=2;11'|bc -l101114:53:53#tp#~> echo 'ibase=2;obase=10;11'|bc -l # 這里obase=10就是二進制 1114:53:58#tp#~> echo 'ibase=2;obase=1010;11'|bc -l3 14:55:21#tp#~> echo 'ibase=2;obase=10;11'|bc -l1114:58:59#tp#~> echo 'obase=10;ibase=2;11'|bc -l # ibase影響你所有的輸入,換個位置就不一樣了 314:59:09#tp#~> 1785.nginx 的 logRotation 機制:mv access.log access.log.0kill -USR1 `cat master.nginx.pid` # 發信號讓進程寫 access.log,而不是 access.log.0 老日志sleep 1gzip access.log.0 # do something with access.log.0 1786.linux 文件系統的一些限制:一級子目錄限制個數:32000 (真正可以容納的是31998個子目錄,. 和 ..)文件名字符長度 255,中文 127文件個數:貌似沒有限制注:不同的文件系統可能限制不一樣,修改 kernel include file 然后 recompile 可以修改限制 1787.關于 find 不管找到與否都返回 0 的問題:因為默認是 find -printfind -type f -name "123" 1788.管道是異步(并行)執行的:20:28:29#tp#~> sleep 999|sleep 998 &[1] 923920:28:34#tp#~> ps -eo lstart,cmd|grep 'sleep 99'Mon Mar 18 20:28:33 2013 sleep 999Mon Mar 18 20:28:33 2013 sleep 998Mon Mar 18 20:28:35 2013 grep --color=auto sleep 9920:28:36#tp#~>sleep 999和sleep 998是同時啟動的,并不是sleep 999執行完成,再執行sleep 998的 管道前后的進程并發執行,不過這個還是會有一個時間差,這個看cpu的調度和負載。正因為如此,ps -fe|grep grep 不一定會有結果,而 ps -fe|grep init 一定有結果ps -fe|grep grep,可能是零個,也可能一個,不過大部分情況都是一個ps -fe|grep init,可能是一個,也可能是兩個,不過大部分情況都是兩個 1789.管道其實在操作內存:echo|ls -l /proc/self/fd/,結果里面的0 -> pipe:[1148917]就是管道文件 或者ls -l /proc/self/fd/|cat,這樣的話1是管道 如果沒有管道的話,應該是/dev/pts/4什么的 self是你當前的pid,fd是這個進程的文件描述符,1148917 是匿名管道的文件名 1790.強大的進程匹配工具 pgrep:可依據多個屬性匹配指定的進程如:pgrep -u root sshdpgrep -fl bash 等價 ps -eo pid,cmd|grep [b]ash 1791.nc 測網卡帶寬:nc -l -p 1235 </dev/zeronc 127.0.0.1 1235 >/dev/null 直接從/dev/zero讀數據到1235端口,然后我的第二個nc從1235接手數據寫到/dev/null,然后ifstat測試當前流量全部走內存,沒有磁盤io,可以用eth測試,但是eth有危險,萬一把網卡堵死,命令都執行不了。 1792.當 FS 為單個空格時,無論 RS 是否被重新定義,FS 始終都是 [ \t\n]+seq 3|awk '{$0=$0"\n#\n";print $1,$2}' 1793.注意大括號命令組的用法:大括號前后空格 和 每條命令分號結束,否則提示命令未結束{ sleep 1; continue; } 1794.lsof && test -s 檢查文件寫入完成,或者先寫臨時文件再 mv:chkFileWriteOver(){while [[ $c -le 3600 ]]do ((c++))# if file length > 0, it's ok.[[ -s $1 ]] || { sleep 1; continue; }lsof $1# if file not locked, it's ok.[[ $? -eq 1 ]] && echo "---------- File is OK ..." && breaksleep 1done# here, if file is exception, you can send a email to somebody.[[ $c -eq 3600 ]] && echo "---------- File is not exsit ..."}chkFileWriteOver fileName 1795.shell的解釋和編譯引起的性能問題:for i in {1..10000}; do str="$str $i"; done# 這里是for慢,不是{1..10000}慢,你echo {1..10000}很快的 解析 1次循環0.001秒 10次循環0.01秒 1000次循環1秒編譯 1次循環0.001秒 10次循環0.002秒 1000次循環0.003秒 編譯其實就是那個意思,并不是那個比例,解析的話幾次就是幾倍 可以認為編譯 T(1),解釋 T(n) 1796.find的路徑問題:-newer 讀取文件時間默認是在當前路徑,因此需要顯示 cd 或者 -newer 絕對路徑find /tmp/mstat ! -newer `date -I -d'3 days ago'`find: 2013-03-24: 沒有那個文件或目錄cd /tmp/mstat; find /tmp/mstat ! -newer `date -I -d'3 days ago'`/tmp/mstat/2013-03-24 1797.sed 模式匹配//與模式替換s///的語法區別:當都是 / 做分隔符并無區別,但是當不是 / 的時候是有語法區別的:sed '\@/usr/local/test.txt@d' # 第一個字符需要轉義,man sed 語法如此,因為還可以被解析為行號sed 's@/usr/local/test.txt@@' # 只能被解析為字符串內容,沒有歧義 1798.iptables 的保存:/etc/init.d/iptables save就好了,保存到 /etc/sysconfig/iptables,啟動自己會去讀取的 也可以手動 iptables-save > a.txt 或者 iptables-restore < a.txt 1799.curl 獲取網頁的狀態碼:http_code=`curl -I -s www.baidu.com -w %{http_code}` && echo ${http_code:9:3} 1800.awk中的隱式數據類型轉換:awk 'BEGIN{a="7868";if(a>=6211&&a<=10075)print "ok"}'awk 'BEGIN{a="56";if(a>=3&&a<=7189)print "ok"}'結果不一致是由于在gawk中,數字和字符串同時比較會發生隱式類型轉換,會把數字轉換成字符串,然后按字符串排序(字典序),要想用數字比較,需要顯示轉換類型:a="7868"+0; 或者 a=int("7868");需要注意的是這樣他只會轉換以數字開頭到第一個字母前的字符串如:echo |awk '{print "a12b"+0,"|",int("a12b"),"|","12b1"+0,"|",int("12b1")}'0 | 0 | 12 | 12awk的sorti也是使用字符串做索引排序,需要注意
轉載于:https://my.oschina.net/leejun2005/blog/121345
總結
以上是生活随笔為你收集整理的shell 学习笔记(18)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Firefox 扩展开发 install
- 下一篇: 正则表达式——常用元字符