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'
相关文章
相关标签/搜索