shell 学习笔记(18)
生活随笔
收集整理的這篇文章主要介紹了
shell 学习笔记(18)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
聲明:轉(zhuǎn)載需署名出處,嚴(yán)禁用于商業(yè)用途!?
1701.大量連接處于 TIME_WAIT 狀態(tài)的解決方法:netstat -nt 看到大量 TIME_WAITdmesg 看到 time wait bucket table overflow解決辦法:1、 /proc/sys/net/ipv4/tcp_max_tw_buckets 過小了,設(shè)成540000以上2、 /sys/module/ip_conntrack/parameters/hashsize 過小了,設(shè)成/proc/sys/net/ipv4/netfilter/ip_conntrack_count這個(gè)值的1/4大小較為合適 1702.編譯php出錯(cuò):error while loading shared libraries: libmysqlclient.so.18: cannot open shared object:ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/照做后仍然報(bào)錯(cuò),原因是該方法適用于32位系統(tǒng),64位系統(tǒng)應(yīng)使用下面的這行l(wèi)n -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/另外:在編譯的時(shí)候,不寫mysql的路徑,而使用mysqld代替,也可解決該問題的出現(xiàn)。 1703.shell打印當(dāng)前行號(hào):echo "$LINENO"顯示函數(shù)在哪一行被調(diào)用的:line(){echo call by line `caller 0 | awk '{print$1}'`}line 1704.當(dāng)系統(tǒng)swap空間所剩不多時(shí),可通過在本地磁盤上創(chuàng)建普通文件作為swap :dd一個(gè)文件,然后mkswap,然后swapondd if=/dev/zero of=./swapfile bs=1M count=1000mkswap ./swapfileswapon ./swapfile 即可為系統(tǒng)臨時(shí)增加1G的swap。使用完畢后執(zhí)行:swapoff ./swapfilerm -f swapfile 1705.多行結(jié)果賦值給變量:用引號(hào)防止 shell 做 word split:file=`find . -name "*"`echo "$file" 1706.wireshark 八進(jìn)制編碼問題:google.com/search?q=淘寶網(wǎng) 這個(gè)http請求,抓包里面對應(yīng)的內(nèi)容是GET /search?q=\314\324\261\246\315\370 HTTP/1.1\r\n\314\324\261\246\315\370這一段對應(yīng)的是淘寶網(wǎng)3個(gè)字,應(yīng)該是gbk,gbk是每個(gè)漢子兩個(gè) \nnn the eight-bit character whose value is the octal value nnn (one to three digits)8進(jìn)制,轉(zhuǎn)換成十六進(jìn)制看看,再看編碼 CC D4對應(yīng)\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進(jìn)制的 1707.sort -n -g 按數(shù)字排序的區(qū)別:-g 通用數(shù)值排序,-n 數(shù)值排序。-g 支持的記數(shù)方法比 -n 廣,-g 使用標(biāo)準(zhǔn) C 函數(shù) strtod 來轉(zhuǎn)換數(shù)值,支持科學(xué)記數(shù)法,如 1.0e-34,不過 -g 比 -n 慢得多。詳細(xì)區(qū)別參考info sort文檔或者stackoverflow.com。 1708.關(guān)于sort -h排序問題:echo "2025K1M1G"|sort -h # du、ls、df 等能保證輸出一定是k<m<g的格式,不會(huì)存在2025k這種形式的。 1709.使用 cURL 測試 Web 站點(diǎn)的響應(yīng)時(shí)間:curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://www.canada.com 1710.設(shè)置用戶的進(jìn)程數(shù)限制:/etc/security/limits.conf/etc/profile里面寫ulimit -n 65535,只有root才能增加,這樣其它用戶登錄都會(huì)報(bào)錯(cuò)。nofile 是打開文件數(shù),nproc是進(jìn)程數(shù),soft 指的是當(dāng)前系統(tǒng)生效的設(shè)置值。hard 表明系統(tǒng)中所能設(shè)定的最大值。soft 的限制不能比hard 限制高。用 - 就表明同時(shí)設(shè)置了 soft 和 hard 的值 1711.ssh不輸出連接信息:ssh -t 會(huì)輸出一個(gè)或者 ssh 加 -q 參數(shù) 或者 2>/dev/null 屏蔽掉 1712.wget將頁面內(nèi)容輸出到標(biāo)準(zhǔn)輸出:wget -qO- http://shushu.com.cn/tm.php # -qO- 相當(dāng)于 -q -O - 1713.iptables端口轉(zhuǎn)發(fā):將本地80端口的請求轉(zhuǎn)發(fā)到8080端口,當(dāng)前主機(jī)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.進(jìn)程間通信方式:PIPE(FIFO) 消息隊(duì)列 信號(hào)量(Semaphore) 共享存儲(chǔ) SOCKET 1715.線程間通信常用的三種方法:1.全局變量進(jìn)程中的線程間內(nèi)存共享,這是比較常用的通信方式和交互方式。注:定義全局變量時(shí)最好使用volatile來定義,以防編譯器對此變量進(jìn)行優(yōu)化。2.Message消息機(jī)制(windows下)常用的Message通信的接口主要有兩個(gè):PostMessage和PostThreadMessage線程常常要將數(shù)據(jù)傳遞給另外一個(gè)線程。Worker線程可能需要告訴別人說它的工作完成了,GUI線程則可能需要交給Worker線程一件新的工作。3.CEvent對象(windows下)CEvent為MFC中的一個(gè)對象,可以通過對CEvent的觸發(fā)狀態(tài)進(jìn)行改變,從而實(shí)現(xiàn)線程間的通信和同步。 1716.本機(jī)免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 不限制寬度輸出:結(jié)果也與終端有關(guān)09:19:48#tp#~> ps -few|wc -L15709:19:50#tp#~> ps -feww|wc -L132609:19:52#tp#~> echo $COLUMNS157 1720./dev/null 被cp,權(quán)限被修改:mknod -m 666 /dev/null c 1 3 # 創(chuàng)建特殊文件的,比如block或者是管道文件 1721.每 n 個(gè)字符截?cái)鄵Q行的幾種方法:echo 123190287923849241483971837103921|sed 's/..../&\n/g'dd cbs=4 conv=unblock; fold -c4;grep -Eo '.{1,4}' 1722.awk輸出到管道或者文件的時(shí)候有buffer,一般是4K,到達(dá)4K才輸出,輸出到標(biāo)準(zhǔn)輸出沒bufferi=0;while sleep 0.1;do echo -ne "\r"$((i++));done|awk 'BEGIN{ORS=RS="\r"}{print $0}'|tee a可以用這個(gè)測試下,如果去掉tee就可以正常顯示,或者去掉awk也可以,兩個(gè)都加上就不行,如果把sleep 0.1改成sleep 0.000001,到達(dá)4K的時(shí)候就會(huì)輸出了,用fflush()可以刷新buffer 1723.od進(jìn)行ascii到八進(jìn)制、10進(jìn)制、16進(jìn)制的轉(zhuǎn)換:printf "^A" | od -An -o # -b -x -d 1724.curl測試網(wǎng)絡(luò)狀況: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串行合并文件內(nèi)容:seq 100|paste -sd ' \n' #每5個(gè)換行echo {1..100}|xargs -n5 #xargs -n 效率比較低echo {1..100}|grep -Po '(\w+ ?){5}' 1726.printf打印ascii的10進(jìn)制值:printf '%d\n' \'c # \'c 意思就是使用字符作為數(shù)字值awk 打印 ascii 對應(yīng) 10 進(jìn)制值:echo a|awk 'BEGIN{for(i=0;i<255;i++)a[sprintf("%c",i)]=i}{print a[$0]}'打印ascii的16進(jìn)制值:printf '%02x' "'+" # echo -n '+' | od -tx1 -An | tr -d ' ' 1727.- 表示標(biāo)準(zhǔn)輸入或者標(biāo)準(zhǔn)輸出,用法舉例:tar cvf - * | (cd /dest/dir && tar xvfp -) # - 需要程序自己支持,例如tar、cat,-可以理解為臨時(shí)文件形式存在-在命令符當(dāng)中表示標(biāo)準(zhǔn)輸入或者標(biāo)準(zhǔn)輸出。在tar cvf - *當(dāng)中,表示標(biāo)準(zhǔn)輸出,因?yàn)閒參數(shù)后面跟的是輸出的,這個(gè)命令的意思就是把當(dāng)前目錄的所有文件,tar打包到標(biāo)準(zhǔn)輸出當(dāng)中然后通過管道,這個(gè)命令的標(biāo)準(zhǔn)輸出作為后面 (cd /dest/dir && tar xvfp -)命令的標(biāo)準(zhǔn)輸入,cd /dest/dir沒有什么好說的,切換到那個(gè)目錄。然后tar xvfp表示解壓縮文件,但是沒有指明是那個(gè)具體的文件?所以就是-了,表示標(biāo)準(zhǔn)輸入當(dāng)中獲取文件,然后解壓縮到當(dāng)當(dāng)前目錄。總體來看,這個(gè)命令就是拷貝文件了。 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的內(nèi)置命令:delete、ls等:find -name "AAA" -ls #同時(shí)減少了-exec執(zhí)行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 將字符串按指定域?qū)挾葎澐?#xff1a;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 的數(shù)量:netstat -town 1734.模擬骰子產(chǎn)生1~6的隨機(jī)數(shù):echo $((0x$(head -c5 /dev/random|xxd -ps)%6+1)) 1735.pkill殺進(jìn)程是模糊匹配,小心誤殺:pkill aaa ,所有進(jìn)程名里包含aaa的都會(huì)被干掉你可以用pgrep看看,進(jìn)程名,不包含參數(shù),你還可以指定tty、用戶名什么的 如果要精確匹配:pgrep -lx 類似 grep 的 -x 按行匹配-f 是不僅僅在進(jìn)程里面查,參數(shù)也會(huì)查 ,就是你pkill -f apache,會(huì)把java -u apache也殺掉。默認(rèn)是只看進(jìn)程名是否匹配 pgrep -fl 9927659 sleep 99-fx 是完整匹配整個(gè)命令行(進(jìn)程名+參數(shù)) ,-x 是完整匹配進(jìn)程名 1736.pkill 踢出who里的登錄終端或者ip:pkill -kill -t pts/2 1737.得到10個(gè)字符的隨機(jī)密碼:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 10 | xargs 1738.perl列出當(dāng)前目錄下所有的符號(hào)鏈接:perl -e 'print map { -l and $_ .= "\n" } <*>' 1739.nnohup退出終端會(huì)斷掉:shopt |grep huponexitgrep -iR hup .bashrc .profile /etc/bash* /etc/profile*找下,反正我這沒有,我是off默認(rèn)值都是off的,開了就會(huì)出現(xiàn)他的那種問題,shell退出不應(yīng)該給這個(gè)shell的子進(jìn)程發(fā)HUP信號(hào)的,可以trap下。 1740.利用nc遠(yuǎn)程傳輸文件:tar -cf - * | nc 172.20.51.51 5555 1741.正則貪婪匹配陷阱:最左邊的貪婪匹配優(yōu)先級(jí)最高,后面的匹配都是基于正則的回溯機(jī)制,所以后面的都屬于非貪婪匹配了。*雖然貪婪,但也可能發(fā)空匹配,因?yàn)樗梢詾?,而+至少匹配一次,限制較強(qiáng)。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下查詢域名對應(yīng)的所有服務(wù)器:nslookup -qt=mx web.qq.com 1744.vi一個(gè)遠(yuǎn)程文件:vi scp://username@host//path/to/somefile #注意雙斜線 1745.刪除所有非打印字符:tr -dc '[:print:]' < filename 1746.PS1 設(shè)置putty等ssh工具的標(biāo)簽頁 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不能實(shí)時(shí)輸出的問題:unbuffer -p tail -f .sh_histoy |awk '{print $0}' 1748.利用 bc 計(jì)算器 obase 參數(shù),實(shí)現(xiàn)十進(jìn)制轉(zhuǎn)二進(jìn)制:echo 'obase=2;98'|bc 1749.為 man 指定閱讀器 pager :less,并搜索指定字符串 034PAGER='less -iRsp034' man ascii 1750.vim中獲取只讀文件的sudo權(quán)限寫入::w !sudo tee %命令:w !{cmd},讓 vim 執(zhí)行一個(gè)外部命令{cmd},然后把當(dāng)前緩沖區(qū)的內(nèi)容從 stdin 傳入。tee 是一個(gè)把 stdin 保存到文件的小工具。而 %,是vim當(dāng)中一個(gè)只讀寄存器的名字,總保存著當(dāng)前編輯文件的文件路徑。所以執(zhí)行這個(gè)命令,就相當(dāng)于從vim外部修改了當(dāng)前編輯的文件,然后從定向到當(dāng)前文件。%! sudo tee % > /dev/null% #VI/VIM編輯的文件內(nèi)容! #管道sudo #以root權(quán)限操作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自定義時(shí)間格式顯示:ls -lth --time-style=+"%F %T" 1753.去除vi打開文件時(shí)帶的顏色及控制亂碼字符:col -b 1754.sh 雖然鏈接到了 /bin/bash,但是 /bin/sh 執(zhí)行效果不完全等同 /bin/bash,而是 /bin/bash --posix有很多系統(tǒng)里 gzip gunzip zcat 都指向一個(gè)inode, 同一程序?qū)Σ煌虞d名作不同動(dòng)作的用法在*nix中太常見了 1755.正則捕獲示例:抓取網(wǎng)頁上的 URL 鏈接:注意設(shè)置 LC_ALL 語言環(huán)境和字符集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 有一行上不能匹配多個(gè)網(wǎng)址的 bug,因?yàn)閟ed需要完全匹配后才能print,下面用 grep 修復(fù)該問題curl -s www.360buy.com | grep -Po '(https?://\w*\.[[:alnum:].]*)' |sort|uniq -c|sort -k1rn注:posix 字符類 [[:alnum:]] 等價(jià)于 [0-9A-Za-z],\w 為 [[:alnum:]_]的同義詞,指單詞字符,相當(dāng)于 [0-9A-Za-z_],關(guān)于這點(diǎn) man grep \w 中有前后矛盾的描述。 1756.sed單引號(hào)轉(zhuǎn)義問題:sed單引號(hào)轉(zhuǎn)義只支持16進(jìn)制 \x27, 而且外層一定要加單引號(hào)或者雙引號(hào)引起來:echo "1'1"|sed -r 's/\x27//' # 不加引號(hào)那shell 會(huì)解釋\x 成為 x,所以要養(yǎng)成加引號(hào)的習(xí)慣不支持8進(jìn)制:echo "1'1"|sed -r 's/\047//' ,而 awk 是兩者都支持的。或者sed中用 "'" 表示單引號(hào) 1757.用 bc -l 加載數(shù)學(xué)庫做小數(shù)計(jì)算:echo 2/70|bc -l # echo 2/70|awk '{printf "%f", 2/70}' 1758.locale 字符集語言環(huán)境的設(shè)置: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' 注:有時(shí)候莫名其妙的問題一般與 LC_ALL=C 有關(guān),C 是 POSIX,和具體語言無關(guān)。其實(shí)最好是C,這樣sort排序會(huì)快很多,還有遇到[a-z]這種情況比較安全,還有 [.-/] 這種 1759.巧用 sed // 上次匹配功能排除邊界值:echo -e "a\n2\nc"|sed '/a/,/c/{//!d}' # // 相當(dāng)于awk中 !/^a|^c/ 1760.shell中轉(zhuǎn)換16進(jìn)制到10進(jìn)制: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 只同步目錄(危險(xiǎn)慎用!)"只" 同步目錄,子目錄的子目錄也可以同步,但子目錄里的文件不同步。rsync -av --delete -f '+ */' -f '- *' SRC/ DEST/ # -f '+ */'是同步目錄,-f '- *'是不同步文件。想把子目錄的內(nèi)容也同步:rsync -av --delete -f '+ */' -f '- /*' SRC/ DEST/ 1762.vim 粘貼板簡介: vim 有 12個(gè)粘貼板 0、1、2、…、9、a、"、+;用:reg命令可以查看各個(gè)粘貼板里的內(nèi)容。在vim中簡單用y只是復(fù)制到 " (雙引號(hào))粘貼板里,p也這樣。Ny完成復(fù)制到N號(hào)剪貼板,其中N為粘貼板號(hào)(注意是按一下雙引號(hào)然后按粘貼板號(hào)最后按y),例如要把內(nèi)容復(fù)制到粘貼板a,選中內(nèi)容后按 "ay 就可以了,有兩點(diǎn)需要說明一下:+號(hào)粘貼板是系統(tǒng)粘貼板,用"+y將內(nèi)容復(fù)制到該粘貼板后可以使用Ctrl+V將其粘貼到其他文檔(如firefox、gedit)中,同理,要把在其他地方用Ctrl+C或右鍵復(fù)制的內(nèi)容復(fù)制到vim中,需要在正常模式下按 "+p,要將vim某個(gè)粘貼板里的內(nèi)容粘貼進(jìn)來,需要退出編輯模式,在正常模式按"Np,其中N為粘貼板號(hào),如上所述,可以按"5p將5號(hào)粘貼板里的內(nèi)容粘貼進(jìn)來,也可以按"+p將系統(tǒng)全局粘貼板里的內(nèi)容粘貼進(jìn)來。 1763.查看本機(jī)外網(wǎng) ip:curl ifconfig.me 1764.awk 處理浮點(diǎn)數(shù)四舍五入的問題: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 中的自動(dòng)生成用戶awk -F: '$0!~/nologin/&&($3=0||$3>=500)' /etc/passwd 1766.利用taskset有效控制cpu資源taskset -c 0 sh job.sh #開啟一個(gè)只用0標(biāo)記的cpu核心的新進(jìn)程(job.sh是你的工作腳本)taskset -pc 0 23328 #查找現(xiàn)有的進(jìn)程號(hào),調(diào)整該進(jìn)程cpu核心使用情況可在top中進(jìn)行負(fù)載check,最后你可以在你的工作腳本中加入該指令來合理利用現(xiàn)有的cpu資源 1767.關(guān)于 [^A-Za-z] 是否等價(jià) [^A-z] 的問題:[^a-zA-Z] 是正則[!a-zA-Z] 是通配符用的地方不一樣,而且A-z包含幾個(gè)非字母字符,且用的時(shí)候還需要注意字符集 1768.校對大量文件的完整性:rsync 返回碼或者 find打印大小,不要用du,du與FS的block大小設(shè)置有關(guān),異構(gòu)的FS中不準(zhǔn)確 1769.登錄linux,執(zhí)行配置文件的順序:/etc/profile -> [~/.bash_profile | ~/.bash_login | ~/.profile] -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout在登錄時(shí),首先會(huì)執(zhí)行/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,中間是生成了臨時(shí)文件的。 1772.查看文件編碼的 2 種方式:file -i 文件名 # vim 中 :set fileencoding 1773.根據(jù)進(jìn)程名顯示進(jìn)程號(hào): pidof java 1774.如何限制用戶的最小密碼長度:修改 /etc/login.defs 里面的PASS_MIN_LEN的值 1775.如何使新用戶首次登陸后強(qiáng)制修改密碼:useradd -p '' testuser; chage -d 0 testuser 1776.vi 編輯標(biāo)準(zhǔn)輸入輸出:crontab -l | vi - 1777.awk 利用協(xié)同進(jìn)程監(jiān)聽指定端口:awk 'BEGIN{service="/inet/tcp/2000/0/0"; service |& getline; print $0; close(service)}' 1778. awk ‘FS=”:” {print $1,$3,$6}’ 明顯不等價(jià)于 awk -F: ‘{print $1,$3,$6}’ ,前者是讀取第一行記錄并將記錄分割成字段之后才進(jìn)行FS的設(shè)置,FS=”:” 作為了模式,通常這樣的寫法是錯(cuò)誤的.例如 awk 'FS=":" {print $1,$3,$6}' /etc/passwd 會(huì)把第一個(gè)整行打印出來 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 缺一不可,否則會(huì)有殘留FS輸出,$4=$4 在重構(gòu)該域時(shí)會(huì)把周圍多個(gè) FS 合并,就像 echo 1 2 一樣 1780.設(shè)置 PS1,根據(jù)上一個(gè)命令返回狀態(tài)碼控制顯示紅色還是綠色:`[ $? -eq 0 ]||echo \[\e[31m\]` 1781.判斷程序輸入來自文件還是標(biāo)準(zhǔn)輸入:用 < 的話也是來自 - 的,不是來自文件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命令的執(zhí)行進(jìn)度:dd if=/dev/zero of=/data3/test bs=1k count=1024000 # a 終端執(zhí)行while killall -USR1 dd; do sleep 5; done # b 終端執(zhí)行然后就能看到間隔5秒一次的輸出結(jié)果了,所執(zhí)行的killall命令循環(huán)會(huì)在dd命令執(zhí)行結(jié)束之后退出。為什么dd命令的進(jìn)度輸出要killall命令來激發(fā)呢?其實(shí)答案很簡單,dd的進(jìn)度輸出就是這么設(shè)計(jì)的,再詳細(xì)點(diǎn)就是dd命令在執(zhí)行的時(shí)候接收到SIGUSR1信號(hào)的輸出當(dāng)前的讀寫進(jìn)度,而killall命令在這里起的作用就是給dd進(jìn)程發(fā)送這個(gè)信號(hào)。對于沒有那些不與終端交互的守護(hù)進(jìn)程(Deamon Process),通常的設(shè)計(jì)是在接收到SIGHUP信號(hào)之后就會(huì)重新讀取配置文件。比如下面的:# 當(dāng)你對smb.conf修改之后,運(yùn)行下面的命令,修改就能生效了# 而不用再來一個(gè)smb restartkillall -HUP smbd 1783.atime、ctime、mtime 區(qū)別與聯(lián)系:atime:訪問時(shí)間(access time),指的是文件最后被讀取的時(shí)間,可以使用touch命令更改為當(dāng)前時(shí)間;ctime:變更時(shí)間(change time),指的是文件屬性最后被變更的時(shí)間,變更動(dòng)作可以使chmod、chgrp、mv等等;mtime:修改時(shí)間(modify time),指的是文件內(nèi)容最后被修改的時(shí)間,修改動(dòng)作可以使echo重定向、vi等等;ctime 變動(dòng)時(shí)不影響 mtimemtime 變動(dòng)時(shí) ctime 一起變。 1784.bc中十進(jìn)制、二進(jìn)制互轉(zhuǎn),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就是二進(jìn)制 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影響你所有的輸入,換個(gè)位置就不一樣了 314:59:09#tp#~> 1785.nginx 的 logRotation 機(jī)制:mv access.log access.log.0kill -USR1 `cat master.nginx.pid` # 發(fā)信號(hào)讓進(jìn)程寫 access.log,而不是 access.log.0 老日志sleep 1gzip access.log.0 # do something with access.log.0 1786.linux 文件系統(tǒng)的一些限制:一級(jí)子目錄限制個(gè)數(shù):32000 (真正可以容納的是31998個(gè)子目錄,. 和 ..)文件名字符長度 255,中文 127文件個(gè)數(shù):貌似沒有限制注:不同的文件系統(tǒng)可能限制不一樣,修改 kernel include file 然后 recompile 可以修改限制 1787.關(guān)于 find 不管找到與否都返回 0 的問題:因?yàn)槟J(rèn)是 find -printfind -type f -name "123" 1788.管道是異步(并行)執(zhí)行的: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是同時(shí)啟動(dòng)的,并不是sleep 999執(zhí)行完成,再執(zhí)行sleep 998的 管道前后的進(jìn)程并發(fā)執(zhí)行,不過這個(gè)還是會(huì)有一個(gè)時(shí)間差,這個(gè)看cpu的調(diào)度和負(fù)載。正因?yàn)槿绱?#xff0c;ps -fe|grep grep 不一定會(huì)有結(jié)果,而 ps -fe|grep init 一定有結(jié)果ps -fe|grep grep,可能是零個(gè),也可能一個(gè),不過大部分情況都是一個(gè)ps -fe|grep init,可能是一個(gè),也可能是兩個(gè),不過大部分情況都是兩個(gè) 1789.管道其實(shí)在操作內(nèi)存:echo|ls -l /proc/self/fd/,結(jié)果里面的0 -> pipe:[1148917]就是管道文件 或者ls -l /proc/self/fd/|cat,這樣的話1是管道 如果沒有管道的話,應(yīng)該是/dev/pts/4什么的 self是你當(dāng)前的pid,fd是這個(gè)進(jìn)程的文件描述符,1148917 是匿名管道的文件名 1790.強(qiáng)大的進(jìn)程匹配工具 pgrep:可依據(jù)多個(gè)屬性匹配指定的進(jìn)程如:pgrep -u root sshdpgrep -fl bash 等價(jià) ps -eo pid,cmd|grep [b]ash 1791.nc 測網(wǎng)卡帶寬:nc -l -p 1235 </dev/zeronc 127.0.0.1 1235 >/dev/null 直接從/dev/zero讀數(shù)據(jù)到1235端口,然后我的第二個(gè)nc從1235接手?jǐn)?shù)據(jù)寫到/dev/null,然后ifstat測試當(dāng)前流量全部走內(nèi)存,沒有磁盤io,可以用eth測試,但是eth有危險(xiǎn),萬一把網(wǎng)卡堵死,命令都執(zhí)行不了。 1792.當(dāng) FS 為單個(gè)空格時(shí),無論 RS 是否被重新定義,FS 始終都是 [ \t\n]+seq 3|awk '{$0=$0"\n#\n";print $1,$2}' 1793.注意大括號(hào)命令組的用法:大括號(hào)前后空格 和 每條命令分號(hào)結(jié)束,否則提示命令未結(jié)束{ sleep 1; continue; } 1794.lsof && test -s 檢查文件寫入完成,或者先寫臨時(shí)文件再 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次循環(huán)0.001秒 10次循環(huán)0.01秒 1000次循環(huán)1秒編譯 1次循環(huán)0.001秒 10次循環(huán)0.002秒 1000次循環(huán)0.003秒 編譯其實(shí)就是那個(gè)意思,并不是那個(gè)比例,解析的話幾次就是幾倍 可以認(rèn)為編譯 T(1),解釋 T(n) 1796.find的路徑問題:-newer 讀取文件時(shí)間默認(rèn)是在當(dāng)前路徑,因此需要顯示 cd 或者 -newer 絕對路徑find /tmp/mstat ! -newer `date -I -d'3 days ago'`find: 2013-03-24: 沒有那個(gè)文件或目錄cd /tmp/mstat; find /tmp/mstat ! -newer `date -I -d'3 days ago'`/tmp/mstat/2013-03-24 1797.sed 模式匹配//與模式替換s///的語法區(qū)別:當(dāng)都是 / 做分隔符并無區(qū)別,但是當(dāng)不是 / 的時(shí)候是有語法區(qū)別的:sed '\@/usr/local/test.txt@d' # 第一個(gè)字符需要轉(zhuǎn)義,man sed 語法如此,因?yàn)檫€可以被解析為行號(hào)sed 's@/usr/local/test.txt@@' # 只能被解析為字符串內(nèi)容,沒有歧義 1798.iptables 的保存:/etc/init.d/iptables save就好了,保存到 /etc/sysconfig/iptables,啟動(dòng)自己會(huì)去讀取的 也可以手動(dòng) iptables-save > a.txt 或者 iptables-restore < a.txt 1799.curl 獲取網(wǎng)頁的狀態(tài)碼:http_code=`curl -I -s www.baidu.com -w %{http_code}` && echo ${http_code:9:3} 1800.awk中的隱式數(shù)據(jù)類型轉(zhuǎn)換:awk 'BEGIN{a="7868";if(a>=6211&&a<=10075)print "ok"}'awk 'BEGIN{a="56";if(a>=3&&a<=7189)print "ok"}'結(jié)果不一致是由于在gawk中,數(shù)字和字符串同時(shí)比較會(huì)發(fā)生隱式類型轉(zhuǎn)換,會(huì)把數(shù)字轉(zhuǎn)換成字符串,然后按字符串排序(字典序),要想用數(shù)字比較,需要顯示轉(zhuǎn)換類型:a="7868"+0; 或者 a=int("7868");需要注意的是這樣他只會(huì)轉(zhuǎn)換以數(shù)字開頭到第一個(gè)字母前的字符串如:echo |awk '{print "a12b"+0,"|",int("a12b"),"|","12b1"+0,"|",int("12b1")}'0 | 0 | 12 | 12awk的sorti也是使用字符串做索引排序,需要注意
轉(zhuǎn)載于:https://my.oschina.net/leejun2005/blog/121345
總結(jié)
以上是生活随笔為你收集整理的shell 学习笔记(18)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Firefox 扩展开发 install
- 下一篇: 正则表达式——常用元字符