linux shell經常使用命令

  1. jvmhtml

    sudo -u admin /opt/ifeve/java/bin/jstack 31177 > /home/tengfei.fangtf/dump17java

    grep java.lang.Thread.State dump17 | awk '{print $2$3$4$5}' | sort | uniq -c linux

    44 RUNNABLE 22 TIMED_WAITING(onobjectmonitor) 9 TIMED_WAITING(parking) 36 TIMED_WAITING(sleeping) 130 WAITING(onobjectmonitor) 1 WAITING(parkingandroid

  2. 在這裏可能會出現三種狀況:
    第一種狀況,某個線程一直CPU利用率100%,則說明是這個線程有可能有死循環,那麼請記住這個PID。
    第二種狀況,某個線程一直在TOP十的位置,這說明這個線程可能有性能問題。
    第三種狀況,CPU利用率TOP幾的線程在不停變化,說明並非由某一個線程致使CPU偏高。
    若是是第一種狀況,也有多是GC形成,咱們能夠用jstat命令看下GC狀況,看看是否是由於持久代或年老代滿了,產生Full GC,致使CPU利用率持續飆高,命令以下。
  3. sudo netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n
          1 established)
          1 Foreign
          1 SYN_RECV
          4 TIME_WAIT
          9 ESTABLISHED
         10 LISTEN
  4. 在處理一個CSV文件時,須要給每行的結尾加上某個字符串,使用sed 's/$/xxx/g' 或者awk '{print $0"wtf"}'都不成功,替換後,把行首的幾個字符也給替換了,用vim打開,發現行尾有個^M,百度了一下,而後用dos2unix工具處理了一下,再替換就能夠成功了。使用grep過濾以xxx開頭或者結尾的數據。grep -E '^wtf.*$|^.*wtf$',,,,sed命令將 '  替換成 \' 命令爲 sed  "s/'/\\\'/g"ios

  5. [root@wtf tmp]# sed "s/a/'/g" wtf
    wtfh'h'wtf1
    wtfh'h'wtf2
    [root@wtf tmp]# sed "s/a/'/g" wtf | sed "s/'/\\\'/g"
    wtfh\'h\'wtf1
    wtfh\'h\'wtf2
  6. linux 行尾 ^M 是什麼
    這和Linux與Windows斷行格式有關。DOS (Windows 系統)使用的斷行字符爲 ^M$ ,咱們稱爲 CR 與 LF 兩個符號。 而在 Linux 底下,則是僅有 LF ($) 這個斷行符號。
    在 Linux 底下打開Windows的檔案時,因爲 DOS 的斷行符號是 CRLF ,就會多了一個 ^M 的符號出來。
    在這樣的狀況下,若是是一個 shell script 的程序檔案,將可能形成「程序沒法執行」的狀態~ 由於他會誤判程序所下達的指令內容。
    可使用dos2unix來轉換:
    dos2unix file
  7. 在shell中判斷一個數是否是另外一個數的整數倍mongodb

  8. #!/bin/sh
    num=`expr $1 % 5`
    if [ ${num} -eq 0 ]
      then
        echo "ok"
      else
        echo "not ok"
    fi
  9. tcp各個數據shell


  10. netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    TIME_WAIT 5009
    FIN_WAIT1 19
    ESTABLISHED 3
    FIN_WAIT2 2
    SYN_RECV 14
    CLOSING 146
    LAST_ACK 1
  11. 刪除大量小文件express

    rsync --delete-before -a -H  --stats test/ cache-bak/
    json

  12. for循環vim

    applist=(app1 app2 app3);for app in ${applist[@]};do echo $app;done;

  13. 獲取IP地址

    ifconfig |grep -Po '(?<=addr:).*(?=Bc)'

    ifconfig|awk -F"[: ]+" '$4~/[0-9].+[^0-9]+/{print $4}/lo/{exit}'

    ifconfig|sed -nr 's/^[[:space:]]+inet addr:(.*) Bcast.*/\1/p'

    ifconfig | grep -o '\([1-9]\{1,3\}\.\)\{3\}[0-4]\{3,\}'

  14. 格式化輸出文檔

    cat xxxx | awk '{print "n"NR"="$1,"m"NR"="$2}'|column -t 將格式化輸出文檔

  15. 輸出某段時間內的日誌 日誌切割

    sed -n '/2015-07-27 11:00/,/2015-07-27 11:20/p' xxx_server_log > dsadsads.log

    sed -n '/06\/Dec\/2016:20:30:00/,/06\/Dec\/2016:21:00:00/p' json_access.log.2016-12-06 > dsadsads.log #加了轉義

    輸出第幾行到第幾行 sed -n "5,10p"  ln.sh > /tmp/aa

  16. echo不換行輸出

    echo -n "xx";

  17. awk或者echo中輸出換行符或者Tab鍵

    echo -e "123\t345" > /tmp/123.txt;cat /tmp/123.txt | awk '{ print $1 "\t,\n" $2 }'

  18. 移動非空目錄

    mv -b xx /tmp/xx.`date +%s`

    強制覆蓋

    mv -f xx /tmp/xx

  19. 替換文件

    將/tmp/xx文件裏的android全替換成ios;

    app=ios; sed -i "s/android/$app/g" /tmp/xx

  20. 獲取系統當前時間

    echo `date +%Y%m%d%H%M%S`  #注意大小寫,獲取當前時間20170425100834

    echo `date +%s` #注意大小寫,獲取當前時間秒值

    echo `date +%s_%N` #當前系統秒值及納秒值

  21. vim 刪除當前行到最後一行

    進入命令模式

    :,$d  #刪除當前行到最後一行

    :9,.d  #刪除第9行到當前行  

    :set nu!  #顯示行數

  22. shell中的

    $*,$@和$# 

    腳本名稱叫test.sh,入參三個: 1 2 3

    $*爲"1 2 3" 一塊兒被引號包含

    $@爲"1" "2" "3"  $@表示入參組成的數組,好比說在腳本中定義了paraArr=$@,入參是1 2 3,那麼para=$@,實際上表示的是paraArr=(1 2 3),固然能夠給每一個參數加雙引號,可是畫蛇添足.

    $#爲3表示參數數量

  23. 查看用戶所在的組

    有用戶wtf,要查看用戶所在的組,好比使用命令chown <username>:<usergroup>  <files>

    id wtf或者groups wtf均可以了.

  24. grep -q

    grep -q主要用來判斷參數或者輸入中是否包含某些字符,進而根據判斷結果執行某些邏輯,以下示


    if echo "x" | grep -q "qwer" ;then echo yes;else echo no; fi

    no

    if echo "xqwer" | grep -q "qwer" ;then echo yes;else echo no; fi

    yes

  25. grep過濾文本,輸入文本上幾行,下幾行,或者上下幾行

    grep -C 10 "wtf" xxx.txt; #輸出wtf字符所在行的上下10行

    grep -B 10 "wtf" xxx.txt; #輸出wtf字符所在行的上10行,或者叫前10行,before

    grep -A 10 "wtf" xxx.txt; #輸出wtf字符所在行的下10行,或者叫後10行,after

    問,怎麼同時輸入前10行,後5行 :-)

  26. 查找相關文件並執行刪除操做

    參考了這個連接: http://blog.csdn.net/done58/article/details/50151399 

    sudo find  /tmp/xx/ -name wtf -type f -exec mv -bf {} /tmp/wtf`date +%Y%m%d%H%M%S` \; 這個命令從目錄/tmp/xx/及其子目錄中查找名爲wtf的文件,-type f 限制查找出的目標爲文件而不是文件夾,,而後將其移動到/tmp目錄下,注意這個命令必定要帶最後的 \;

    find . -mtime +90 -exec mv {} /var/tmp/date_90 \; 查看大於90天的文件並移動;

    find .  -type f  |  xargs  -I  '{}'  mv  {}  /opt/shell 這個命令把當前目錄下的全部文件夾都移動到/opt/shell裏,沒有用-exec可是用了管道,也實現了一樣的效果

    find /tmp -name  wtf  -type d | xargs rm -rf; 查找名爲wtf的文件夾,而後將其刪除;

    find / -size +50M -type f| xargs du -h; 查找大於50M的文件並查看其具體大小

    find /tmp -mtime +1 -type f | grep -v autorun.sh | xargs sudo rm ; 查找/tmp目錄內1天前的

    sudo find / -size +50M -type f| grep -E "out|log"| xargs sudo rm 查詢大於50M,且包含out或者log的文件,並刪除

    ps -ef |grep storm | grep -v grep | awk '{print $2}' | xargs sudo kill ; 殺掉一批進程

    文件(不包括文件夾) 且排除autorun.sh,而後將其刪除

    +表示大於    -表示小於

    若是查詢時遇到異常,來源於: http://blog.csdn.net/yabingshi_tech/article/details/46604615 

    find: paths must precede expression

    進行查找資料,多文件的查找的時候須要增長單引號

    rm: missing operand 若是遇到這個問題,緣由之一是由於沒有匹配find條件的結果.

    find同時匹配多個文件, find ./lib/ -name 'log4j*' -o -name 'logback*'

    項目裏的log4j日誌級別配置的是info可是部署後仍然打印debug日誌,百度了一下,多是由於項目裏沒有排除logback包,因此用命令在lib裏同時查找logback和log4j的jar包


  27. 忽略命令的輸出

    >/dev/null  2>&1 

  28. ls | sed "s:^:`pwd`/:"
    # 就是在每行記錄的開頭加上當前路徑
    ps:
    #在全部行以前/後加入某個字符串
    sed 's/^/string/g' file
    sed 's/$/string/g' file
    find  $PWD -maxdepth 1  | xargs ls -ld
    # 列出當前目錄下的全部文件(包括隱藏文件)的絕對路徑, 對目錄不作遞歸
    find  $PWD | xargs ls -ld
    # 遞歸列出當前目錄下的全部文件(包括隱藏文件)的絕對路徑
  29. windows powershell 列出目錄下的全部文件及路徑

    dir /s /b /a 

    在CMD中可用「dir /s /b /a」來得到當前目錄及子目錄全部文件,且顯示這些文件的路徑

    C:\Users\much\AppData\Local\ACD Systems\Catalogs
    C:\Users\much\AppData\Local\ACD Systems\data
    C:\Users\much\AppData\Local\ACD Systems\GeoTag
    C:\Users\much\AppData\Local\ACD Systems\ICMCache
    C:\Users\much\AppData\Local\ACD Systems\Logs

  30. jstat Could not attach to 

    這個多是權限的問題.好比該進程是由root用戶啓動的,而你用普通用戶執行

    jstat -gcutil <pid> <時間間隔>

    即會報jstat Could not attach to ,換到root用戶下執行就能夠了.

  31.  windows 查看端口命令參考自:http://wenku.baidu.com/view/681f0332a32d7375a4178046.html

    netstat -aon|findstr "80" 由此可看到80的端口號

    再用命令查看這個端口號對應的進程  tasklist|findstr "2044",這個就是查看端口號對應的進程了

  32. linux crontab相關

    每分鐘執行一次 * * * * *

    每五分鐘執行   */5 * * * *

    每小時執行     0 * * * *

    天天執行       0 0 * * *

    每週執行       0 0 * * 0

    每個月執行       0 0 1 * *

    每一年執行       0 0 1 1 *

    安裝: sudo yum -y install crontabs

    若是運行時遇到錯誤提示/tmp/crontab.ZIgBhN: No such file or directory,那多是/tmp目錄被刪除或者沒有權限,給/tmp 777的權限便可. sudo chmod 777 /tmp

    若是遇到Reloading crond:                                           [FAILED]的錯誤,看看是否是權限不夠,用sudo試試或者直接到root用戶下執行命令

    /etc/init.d/crond reload

    /etc/init.d/crond restart/start/stop

  33. 列出文件並按時間順序排列

    出自: http://www.cnblogs.com/wangkongming/p/3994962.html 

    按照時間升序 ls -lrt

    按照時間降序(最新修改的排在前面)ls -lt

  34. linux安裝zookeeper

    配置好java環境變量


    下載zookeeper-3.4.8.tar.gz並解壓; cd 到conf目錄,cp zoo_sample.cfg zoo.cfg;修改zoo.cfg,指定dataDir,能夠設置autopurge.snapRetainCount=3和autopurge.purgeInterval=1,取消註釋.

    啓動應用: sudo sh zkServer.sh -start; 

    ps -ef | grep java;

  35. export JAVA_HOME=/home/java
    export PATH=$JAVA_HOME/bin:$PATH 
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  36. windows相似grep的命令 conda list | findstr "pandas"; 從命令結果中過濾出包含pandas的紀錄

  37. windows殺進程的命令

  38. [c:\~]$ netstat -aon|findstr 1099
      TCP    0.0.0.0:1099           0.0.0.0:0              LISTENING       10012
      TCP    [::]:1099              [::]:0                 LISTENING       10012
    
    [c:\~]$ taskkill /pid 10012
    錯誤: 沒法終止 PID 爲 10012 的進程。
    緣由: 只能強行終止這個進程(帶 /F 選項)。
    
    [c:\~]$ taskkill /F /pid 10012
    成功: 已終止 PID 爲 10012 的進程。
    
    [c:\~]$ netstat -aon|findstr 1099

28. 看mongodb是否在運行

    找到mongod文件: sudo find / -name 'mongod' 配置文件通常能夠用這個命令找到: sudo find / -name "mongo*.conf"

    啓動命令:  ./mongod --config /etc/mongod.conf 若是啓動失敗mongod.conf裏通常就有日誌文件,必定要去看日誌

$  ./mongod --config /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 27187
ERROR: child process failed, exited with error number 48

    查看mongodb有沒有啓動: sudo netstat -apn | grep 27017 若是有LISTEN的狀態即啓動,前提是mongodb用的這個端口; 或者用 ps -ef | grep mongod 有返回: supdev    1998 43451  0 Oct13 pts/6    04:24:37 mongod,便可

    mongodb必定不要用kill -9來殺進程,必定要用./mongod --shutdown,參考    http://www.cnblogs.com/joshua317/articles/5190385.html 

    mongo正常啓動的日誌顯示:

$ ./mongod --config /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 35363
child process started successfully, parent exiting

 29. 軟連接的區別

對普通文件而言cp -s 與 ln -s效果徹底相同。cp -s 不能爲目錄建立符號連接而 ln -s 則能夠。cp -sa能夠遞歸爲一個目錄內的全部文件分別建立軟連接而ln則不能。(注意這門課說的「軟連接」正確翻譯應該叫「符號連接」)

30. 今天發現有個服務器不紀錄歷史命令

echo $HISTSIZE 這個變量的值是1000. 查看了~/.bash_history,這個文件是有的,可是我看權限是-rw------,感受應該是權限有問題,因而直接給了777權限,關掉鏈接再打開發現已經能記錄歷史命令了,完美解決了這個問題。

31. grep條件 OR 日誌,打印太多亂七八糟的東西,淹沒了正常的日誌,過濾之

tail -fn200 /xxxx/catalina.out |grep -vE "異步通知|x1|x2|x3|x4|x5"

32.sed命令 :https://www.cnblogs.com/linux-wangkun/p/5745584.html 

# 替換文件中的全部匹配項
sed -i 's/原字符串/替換字符串/g' filename

# 同時執行兩個替換規則

sed 's/^/添加的頭部&/g;s/$/&添加的尾部/g'
相關文章
相關標籤/搜索