1. 程式人生 > >linux及shell常用命令

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後者有分隔符的話一次只輸出一個

從管道中讀取輸入的方法,比如想把中間結果輸出

  1. #!/bin/bash  
  2. while read file; do  
  3.         echo $file  
  4.         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}'  
  5. 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

這表示vmstat2秒採集資料,一直採集,直到我結束程式,這裡採集了5次資料我就結束了程式。

好了,命令介紹完畢,現在開始實戰講解每個引數的意思。

r表示執行佇列(就是說多少個程序真的分配到CPU),我測試的伺服器目前CPU比較空閒,沒什麼程式在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關係,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,伺服器的狀態很危險。top的負載類似每秒的執行佇列。如果執行佇列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。

b表示阻塞的程序,這個不多說,程序阻塞,大家懂的。

swpd虛擬記憶體已使用的大小,如果大於0,表示你的機器實體記憶體不足了,如果不是程式記憶體洩露的原因,那麼你該升級記憶體了或者把耗記憶體的任務遷移到其他機器。

free空閒的實體記憶體的大小,我的機器記憶體總共8G,剩餘3415M

buff   Linux/Unix系統是用來儲存,目錄裡面有什麼內容,許可權等的快取,我本機大概佔用300M

cache cache直接用來記憶我們開啟的檔案,給檔案做緩衝,我本機大概佔用300M(這裡是Linux/Unix的聰明之處,把空閒的實體記憶體的一部分拿來做檔案和目錄的快取,是為了提高程式執行的效能,當程式使用記憶體時,buffer/cached會很快地被使用。)

si每秒從磁碟讀入虛擬記憶體的大小,如果這個值大於0,表示實體記憶體不夠用或者記憶體洩露了,要查詢耗記憶體程序解決掉。我的機器記憶體充裕,一切正常。

so每秒虛擬記憶體寫入磁碟的大小,如果這個值大於0,同上。

bi塊裝置每秒接收的塊數量,這裡的塊裝置是指系統上所有的磁碟和其他塊裝置,預設塊大小是1024byte,我本機上沒什麼IO操作,所以一直是0,但是我曾在處理拷貝大量資料(2-3T)的機器上看過可以達到140000/s,磁碟寫入速度差不多140M每秒

bo塊裝置每秒傳送的塊數量,例如我們讀取檔案,bo就要大於0bibo一般都要接近0,不然就是IO過於頻繁,需要調整。

in每秒CPU的中斷次數,包括時間中斷

cs每秒上下文切換次數,例如我們呼叫系統函式,就要進行上下文切換,執行緒的切換,也要程序上下文切換,這個值要越小越好,太大了,要考慮調低執行緒或者程序的數目,例如在apachenginx這種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色彩設定

  1. 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將要執行的指令放在背景執行
-pprompt 可以更改問密碼的提示語,其中 %u 會代換為使用者的帳號名稱, %h 會顯示主機名稱
-uusername/#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 

[image]

看到了吧,系統預設的
alias指令也就這幾個而已,你也可以自定義你想要的指令別名。alias語法很簡單,alias [命令別名]=[’具體的命令’]。

3)

作業控制

當執行一個程序時,你可以使它暫停(按Ctrl+z),然後使用fg命令恢復它,利用bg命令使他到後臺執行,你也可以使它終止(按Ctrl+c