linux及shell常用命令
轉自:https://blog.csdn.net/legendavid/article/details/49281497
$LD_LIBRARY_PATH使用的時候要注意多個路徑的順序,可能會導致應該用同一個版本路徑下的so卻用了兩個不同的導致一些無法解釋的錯誤
用公共賬號採用自己的bashrc
if [[ $SUDO_USER == "daijiliang" ]];then
source /home/daijiliang/.bashrc
fi
檢視時間戳對應的時間:
date -d @1482739648
用shell替換檔案內容:
perl -pi -e 's|logging\.conf|logging\.conf\.local|g' /home/s/apps/CloudSearch/robotqa/etc/mod_robotqa.conf
使用stringstream的時候使用ss.str()輸出而不是ss >> out後者有分隔符的話一次只輸出一個
從管道中讀取輸入的方法,比如想把中間結果輸出
- #!/bin/bash
- while read file; do
- echo $file
- echo $file | python ./getKewWord/getKeyWord.py | ./segmenter -p 1 | python keyword.py | sort -t $'\t' -k2,2nr -T ./ | head -10 | awk -F '\t' 'BEGIN{out="";}{if(out == "") out = $1;else out = out" | "$1}END{print out}'
- done
cpu佔用跟記憶體佔用都不高但是系統卡的話可以看top裡面的wa即io情況檢視是否瓶頸
線上機器沒開core的時候可以用dmesg觀察是否有core
netstat
-a (all)顯示所有選項,預設不顯示LISTEN相關
-t (tcp)僅顯示tcp相關選項
-u (udp)僅顯示udp相關選項
-n 拒絕顯示別名,能顯示數字的全部轉化成數字。
-l 僅列出有在 Listen (監聽) 的服務狀態
-p 顯示建立相關連結的程式名
-r 顯示路由資訊,路由表
-e 顯示擴充套件資訊,例如uid等
-s 按各個協議進行統計
-c 每隔一個固定時間,執行該netstat命令。
提示:LISTEN和LISTENING的狀態只有用-a或者-l才能看到
vmstat
vmstat命令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的伺服器的狀態值,包括伺服器的CPU使用率,記憶體使用,虛擬記憶體交換情況,IO讀寫情況。這個命令是我檢視Linux/Unix最喜愛的命令,一個是Linux/Unix都支援,二是相比top,我可以看到整個機器的CPU,記憶體,IO的使用情況,而不是單單看到各個程序的CPU使用率和記憶體使用率(使用場景不一樣)。
一般vmstat工具的使用是通過兩個數字引數來完成的,第一個引數是取樣的時間間隔數,單位是秒,第二個引數是取樣的次數,如:
[email protected]:~#vmstat 21
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
10034984723158363819540000120001000
2表示每個兩秒採集一次伺服器狀態,1表示只採集一次。
實際上,在應用過程中,我們會在一段時間內一直監控,不想監控直接結束vmstat就行了,例如:
[email protected]:~#vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
10034998403158363819660000120001000000349958431583638196600000881580010000003499708315836381966000028616200100000034997083158363819660000108115100100010034997323158363819660000283154001000
這表示vmstat每2秒採集資料,一直採集,直到我結束程式,這裡採集了5次資料我就結束了程式。
好了,命令介紹完畢,現在開始實戰講解每個引數的意思。
r表示執行佇列(就是說多少個程序真的分配到CPU),我測試的伺服器目前CPU比較空閒,沒什麼程式在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關係,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,伺服器的狀態很危險。top的負載類似每秒的執行佇列。如果執行佇列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。
b表示阻塞的程序,這個不多說,程序阻塞,大家懂的。
swpd虛擬記憶體已使用的大小,如果大於0,表示你的機器實體記憶體不足了,如果不是程式記憶體洩露的原因,那麼你該升級記憶體了或者把耗記憶體的任務遷移到其他機器。
free空閒的實體記憶體的大小,我的機器記憶體總共8G,剩餘3415M。
buff Linux/Unix系統是用來儲存,目錄裡面有什麼內容,許可權等的快取,我本機大概佔用300多M
cache cache直接用來記憶我們開啟的檔案,給檔案做緩衝,我本機大概佔用300多M(這裡是Linux/Unix的聰明之處,把空閒的實體記憶體的一部分拿來做檔案和目錄的快取,是為了提高程式執行的效能,當程式使用記憶體時,buffer/cached會很快地被使用。)
si每秒從磁碟讀入虛擬記憶體的大小,如果這個值大於0,表示實體記憶體不夠用或者記憶體洩露了,要查詢耗記憶體程序解決掉。我的機器記憶體充裕,一切正常。
so每秒虛擬記憶體寫入磁碟的大小,如果這個值大於0,同上。
bi塊裝置每秒接收的塊數量,這裡的塊裝置是指系統上所有的磁碟和其他塊裝置,預設塊大小是1024byte,我本機上沒什麼IO操作,所以一直是0,但是我曾在處理拷貝大量資料(2-3T)的機器上看過可以達到140000/s,磁碟寫入速度差不多140M每秒
bo塊裝置每秒傳送的塊數量,例如我們讀取檔案,bo就要大於0。bi和bo一般都要接近0,不然就是IO過於頻繁,需要調整。
in每秒CPU的中斷次數,包括時間中斷
cs每秒上下文切換次數,例如我們呼叫系統函式,就要進行上下文切換,執行緒的切換,也要程序上下文切換,這個值要越小越好,太大了,要考慮調低執行緒或者程序的數目,例如在apache和nginx這種web伺服器中,我們一般做效能測試時會進行幾千併發甚至幾萬併發的測試,選擇web伺服器的程序可以由程序或者執行緒的峰值一直下調,壓測,直到cs到一個比較小的值,這個程序和執行緒數就是比較合適的值了。系統呼叫也是,每次呼叫系統函式,我們的程式碼就會進入核心空間,導致上下文切換,這個是很耗資源,也要儘量避免頻繁呼叫系統函式。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。
us使用者CPU時間,我曾經在一個做加密解密很頻繁的伺服器上,可以看到us接近100,r執行佇列達到80(機器在做壓力測試,效能表現不佳)。
sy系統CPU時間,如果太高,表示系統呼叫時間長,例如是IO操作頻繁。
id空閒 CPU時間,一般來說,id + us + sy = 100,一般我認為id是空閒CPU使用率,us是使用者CPU使用率,sy是系統CPU使用率。
wt等待IO CPU時間。
shell上: 0表示標準輸入 1表示標準輸出 2表示標準錯誤輸出 > 預設為標準輸出重定向,與 1> 相同 2>&1 意思是把 標準錯誤輸出 重定向到 標準輸出. &>file 意思是把 標準輸出 和 標準錯誤輸出 都重定向到檔案file中 |
統計響應時間平均
tail -n 10000 access.qfedd.log | grep tm= | awk '{for (f=1; f <= NF; f+=1) {if ($f ~ /tm=/) {print NR,$f}}}' | awk -F '=' '{s += $2}END{print s/NR}'
統計響應時間中位數所在行
tail -n 10000 access.qfedd.log | grep tm= | awk '{for (f=1; f <= NF; f+=1) {if ($f ~ /tm=/) {print NR,$f}}}' | awk -F '=' '{print $2}' | sort -n | wc -l | awk '{print $1/2}'
tail -n 10000 access.qfedd.log | grep tm= | awk '{for (f=1; f <= NF; f+=1) {if ($f ~ /tm=/) {print NR,$f}}}' | awk -F '=' '{print $2}' | sort -n | awk 'NR == 2500 {print}'
其實在linux中要正確匹配tab(退格)符有兩種方式
1:用 grep $'\t' 你的檔案
2:用 grep '按CTRL+V 鍵,再按TAB鍵' 你的檔案
再回到上面的問題,則可以用以下的命令
cat delete.log |grep $'\t'11$'\t' |wc
或者
cat delete.log |grep ‘CTRL+V,TAB11CTRL+V,TAB’|wc
傳輸多用rsync,比scp好,一般格式
rsync -avP SRC DEST
不想保留原來的owner group和permission的話用
rsync -rltDvP SRC DEST
檢視linux版本資訊、系統版本資訊等
lsb_release -a
cat /etc/redhat-release
uname -a
好的ps1色彩設定
- export PS1="\033[01;31m\033[01;31m\u\033[00m\033[00m@\033[01;32m\033[01;32m\h \033[00m\033[00m[\033[01;33m\033[01;33m\t\033[00m\033[00m]:\033[01;34m\033[01;34m\w\033[00m\033[00m\n\$ "
語法
sudo [ -Vhl LvkKsHPSb ] │ [ -p prompt ] [ -c class│- ] [ -a auth_type ] [-u username│#uid ] command引數
-V | 顯示版本編號 |
-h | 會顯示版本編號及指令的使用方式說明 |
-l | 顯示出自己(執行 sudo 的使用者)的許可權 |
-v | 因為 sudo 在第一次執行時或是在 N 分鐘內沒有執行(N 預設為五)會問密碼,這個引數是重新做一次確認,如果超過 N 分鐘,也會問密碼 |
-k | 將會強迫使用者在下一次執行 sudo 時問密碼(不論有沒有超過 N 分鐘) |
-b | 將要執行的指令放在背景執行 |
-p | prompt 可以更改問密碼的提示語,其中 %u 會代換為使用者的帳號名稱, %h 會顯示主機名稱 |
-u | username/#uid 不加此引數,代表要以 root 的身份執行指令,而加了此引數,可以以 username 的身份執行指令(#uid 為該 username 的使用者號碼) |
-s | 執行環境變數中的 SHELL 所指定的 shell ,或是 /etc/passwd 裡所指定的 shell |
-H | 將環境變數中的 HOME (家目錄)指定為要變更身份的使用者家目錄(如不加 -u 引數就是系統管理者 root ) |
command | 要以系統管理者身份(或以 -u 更改為其他人)執行的指令 |
範例
1. sudo -l 列出目前的許可權若使用者不在sudoers中會提示不能執行sudo命令,存在則會顯示詳細的許可權。2. sudo -V 列出 sudo 的版本資訊3. 指令名稱:sudoers(在fc5下顯示不能找到此命令,但用man可以查到其用法。)用來顯示可以使用sudo的使用者想使用CP拷貝一個大目錄(/home/study/test),但又不想拷貝其中的一個子目錄(/home/study/test/test1),應該如何寫命令列
方法:
1. cd /home/study/test
2. rsync -av --exclude test1/ --exlclude test2/ ../test/ /home/copydir
以上,便可將/home/study/test目錄中,除test1和test2目錄外,其他所有的檔案和資料夾copy到/home/copydir
Linux du命令也是檢視使用空間的,但是與df命令不同的是Linux du命令是對檔案和目錄磁碟使用的空間的檢視,還是和df命令有一些區別的.
1.命令格式:
du [選項][檔案]
2.命令功能:
顯示每個檔案和目錄的磁碟使用空間。
3.命令引數:
-a或-all 顯示目錄中個別檔案的大小。
-b或-bytes 顯示目錄或檔案大小時,以byte為單位。
-c或--total 除了顯示個別目錄或檔案的大小外,同時也顯示所有目錄或檔案的總和。
-k或--kilobytes 以KB(1024bytes)為單位輸出。
-m或--megabytes 以MB為單位輸出。
-s或--summarize 僅顯示總計,只列出最後加總的值。
-h或--human-readable 以K,M,G為單位,提高資訊的可讀性。
-x或--one-file-xystem 以一開始處理時的檔案系統為準,若遇上其它不同的檔案系統目錄則略過。
-L<符號連結>或--dereference<符號連結> 顯示選項中所指定符號連結的原始檔大小。
-S或--separate-dirs 顯示個別目錄的大小時,並不含其子目錄的大小。
-X<檔案>或--exclude-from=<檔案> 在<檔案>指定目錄或檔案。
--exclude=<目錄或檔案> 略過指定的目錄或檔案。
-D或--dereference-args 顯示指定符號連結的原始檔大小。
-H或--si 與-h引數相同,但是K,M,G是以1000為換算單位。
-l或--count-links 重複計算硬體連結的檔案。
檢視ip對應的域名,是環境變數
採用hostname命令即可
1)
在Linux中,我們不免要頻繁的修改檔案,下載修改後再上傳,很難提高效率。使用cat命令就可以在腳本里進行多行修改了。當然cat的使用方法還有很多,這裡只是其中的一種使用方法。
cat >> /root/a.txt <<EOF
123456789
bbbbbbbb
FFFFFFFFFFFFFFFFFFFFFFF
EOF
以上的指令碼命令是,在a.txt檔案後面加上三行程式碼。
Cat 和EOF
cat命令是linux下的一個文字輸出命令,通常是用於觀看某個檔案的內容的;
EOF是"end of file",表示文字結束符。
結合這兩個標識,即可避免使用多行echo命令的方式,並實現多行輸出的結果。
注意EOF只是標識,並不是固定不變的也可以用別的符號代替比如EEE等等。Cat << EOF ...EOF 最後一個EOF一定定格寫,還有相關命令一定要定格寫
2)
別名
前面也出現過alias的介紹,這個就是bash所特有的功能之一了。我們可以通過alias把一個常用的並且很長的指令別名一個簡潔易記的指令。如果不想用了,還可以用unalias解除別名功能。直接敲alias會看到目前系統預設的alias :
看到了吧,系統預設的alias指令也就這幾個而已,你也可以自定義你想要的指令別名。alias語法很簡單,alias [命令別名]=[’具體的命令’]。
3)
作業控制。
當執行一個程序時,你可以使它暫停(按Ctrl+z),然後使用fg命令恢復它,利用bg命令使他到後臺執行,你也可以使它終止(按Ctrl+c)。