常用shell

shell清单

Posted by Bug1024 on April 12, 2017

内置变量

    $0 脚本名称
    $n 传给脚本/函数的第n个参数
    $$ 脚本的PID
    $! 上一个被执行的命令的PID(后台运行的进程)
    $? 上一个命令的退出状态(管道命令使用${PIPESTATUS})
    $# 传递给脚本/函数的参数个数
    $@ 传递给脚本/函数的所有参数(识别每个参数)
    $* 传递给脚本/函数的所有参数(把所有参数当成一个字符串)

调试

    # 抓包
    tcpdump -i eth2 -w capture.cap tcp port 9501 and dst host 172.16.1.31
    # 跟踪系统调用
    strace -o strace.log -tt -f -e {call} -p {pid}
    # 开启coredump  Mac下的cordump文件不在当前运行目录下,而是在系统指定目录,通常是/cores
    ulimit -c unlimited
    # 查看MTU
    cat /sys/class/net/eth0/mtu
    # -s 包的大小,Specifies the number of data bytes to be sent.
    ping -c 3 -s 2900 -M do 172.168.0.2

用户

    # 新增用户
    useradd user1
    # 设置密码
    passwd user1
    # 新建用户组
    groupadd group1
    # 用户组新增用户
    gpasswd -a user1 group1
    # 修改目录所有者
    chown -R user1:group1 dir1

文本处理

    # 遍历查找当前目录下同时包含xxx和yyy的行
    grep -r "xxx" . | grep "yyy"
    # 遍历查找当前目录下包含xxx或者yyy的行
    grep -r . -e "xxx" -e "yyy"
    # 遍历查找当前目录下包含xxx但不包含yyy的行
    grep -r "xxx" . | grep -v "yyy"
    # 查处字符串出现次数
    grep -o "xxx"|wc -l
    # 显示file文件中匹配foo字串那行以及上下5行
    grep -C 5 foo file
    # 显示foo及前5行
    grep -B 5 foo file
    # 显示foo及后5行
    grep -A 5 foo file
    # 匹配行带文件名,以下命令会返回类似结果结果:file1:hello file2:hhhhello
    grep -H hello file*
    # 查找7天内没访问过的文件
    find path -atime +7
    # 查找7天内访问过的文件
    find path -atime -7
    # 表示在当前目录及其子目录下查找普通文件中包含abc字符串的文件行,经常用于搜索代码
    find . -type f|xargs grep 'abc'
    # 清理文件
    find 路径 -name "*.log.*" -mtime +1 -delete
    # 从备份中的日志查询数据
    bzcat xx.log.bz2 | grep "xxxx"
    bzgrep "xxxx" xx.log.bz2
    # 消除重复行
    sort unsort.txt | uniq
    # 统计各行在文件中出现的次数
    sort unsort.txt | uniq -c
    # 找出重复行
    sort unsort.txt | uniq -d
    # 统计行数,单词数,字符数
    wc -[l][w][c] file
    # 清空文件,文件空间会立刻释放
    echo "" > a.log
    # awk 转义需要两个反斜杆
    awk -F'url\\[' '{print $2}'

磁盘管理

    # 查看当前目录所占空间大小
    du -sh
    # 查看当前目录下所有子文件夹排序后的大小:
    du -sh `ls` | sort
    # 查看当前正在写磁盘的进程id信息
    iotop -o

进程管理

    # 查看8080端口
    lsof -i:8080
    # 查看占用8080端口的进程
    netstat -pan|grep 8080
    # 查看用户username的进程所打开的文件
    lsof -u username
    # 查询nginx进程当前打开的文件
    lsof -c nginx
    # 查询指定的进程ID(23295)打开的文件:
    lsof -p 23295
    # 查看打开文件数最多的10个进程
    lsof +c 10 | awk '{print $1}' | sort | uniq -c | sort -rn | head

性能监控

    # 查看页面交换发生状况 页面发生交换时,服务器的吞吐量会大幅下降,通常是内存不足导致,每秒采样1次,共采样3次
    # sar不可用时,可以使用以下工具替代:linux下有 vmstat、Unix系统有prstat
    sar -W 1 3
    # Linux上的ss命令可以用于替换netstat,ss直接读取解析/proc/net下的统计信息,相比netstat遍历/proc下的每个PID目录,速度快很多
    ss -t -a 显示所有的TCP Sockets
    ss -u -a 显示所有的UDP Sockets
    ss -x src /tmp/a.sock 显示连接到/tmp/a.sock的进程
    ss -o state [state TCP-STATE] 如ss -o state established显示所有建立的连接

系统信息

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数
    # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
    # 查看物理CPU个数
    cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
    # 查看每个物理CPU中core的个数(即核数)
    cat /proc/cpuinfo| grep "cpu cores"| uniq
    # 查看逻辑CPU的个数
    cat /proc/cpuinfo| grep "processor"| wc -l

定时任务

格式:分钟[0-59] 小时[1-23] 日期[1-31] 月份[1-12] 星期[0-6]

    # 实例1:每1分钟执行一次myCommand
    * * * * * myCommand
    # 实例2:每小时的第3和第15分钟执行
    3,15 * * * * myCommand
    # 实例3:在上午8点到11点的第3和第15分钟执行
    3,15 8-11 * * * myCommand
    # 实例4:每隔两天的上午8点到11点的第3和第15分钟执行
    3,15 8-11 */2  *  * myCommand
    # 实例5:每周一上午8点到11点的第3和第15分钟执行
    3,15 8-11 * * 1 myCommand
    # 实例6:每晚的21:30重启smb
    30 21 * * * /etc/init.d/smb restart
    # 实例7:每月1、10、22日的4 : 45重启smb
    45 4 1,10,22 * * /etc/init.d/smb restart
    # 实例8:每周六、周日的1 : 10重启smb
    10 1 * * 6,0 /etc/init.d/smb restart
    # 实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
    0,30 18-23 * * * /etc/init.d/smb restart
    # 实例10:每星期六的晚上11 : 00 pm重启smb
    0 23 * * 6 /etc/init.d/smb restart
    # 实例11:每一小时重启smb
    * */1 * * * /etc/init.d/smb restart
    # 实例12:晚上11点到早上7点之间,每隔一小时重启smb
    0 23-7 * * * /etc/init.d/smb restart

运行

    # 标准输出和错误都被重定向到info.log中, 2>&1表示标准错误拷贝了标准输出的行为
    your_command >info.log 2>&1
    # 挂起后台运行,并忽略所有输出
    nohup your_command  >/dev/null  2>&1 &

Git

    # 不clone历史commit,可加快clone速度
    git clone --depth=1 git_repo_url
    # 切换到远程分支
    git checkout -b branch_name origin/branch_name
    # 撤销add过但未commit的文件
    git reset file
    # checkout远程某个文件
    git checkout origin/branch_name -- file1 file2
    # 追加最近一次的commit
    git commit --amend
    # push到远程分支, 通常local和remote的分支名是一样的
    git push origin local_branch_name:remote_branch_name
    # 删除远程分支
    git push origin :remote_branch_name
    # 强推
    git push -f
    # 更新远程分支
    git remote update -p
    # checkout指定文件
    git checkout origin/remote_branch_name -- file_path

压测

    ab -n100 -c5 http://www.baidu.com/
    # Request per sencond 每秒处理的请求数量
    # Time per request 第一个值为每次并发消耗的平均时间,第二个为每次请求所消耗的平均时间
    # Complete requests 完成的请求数量
    # Failed requests 失败的请求数量

    #wrk 使用的是 HTTP/1.1,缺省开启的是长连接,而 ab 使用的是 HTTP/1.0,缺省开启的是短链接
    #采用多线程 + 异步事件驱动的框架,其中事件机制使用了redis的ae事件框架,协议解析使用了nginx的相关代码
    wrk -c 100 -d 10 http://www.baidu.com/

其他

    # TCP ESTABLISHED数量
    netstat -n|grep ^tcp|awk '{print $NF}'|sort -nr|uniq -c

    #之所以能用到xargs这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如:
    find /sbin -perm +700 |ls -l       这个命令是错误的
    find /sbin -perm +700 |xargs ls -l   这样才是正确的
    #Mac home目录下创建目录
    用命令 sudo vim /etc/auto_master 打开文件,把里面的home开始的行删掉或用#注释掉
    然后用命令 sudo automount 使设置立刻生效
    # 判断端口是否通
    nc -z 10.1.1.1 8081
    #查看网卡大小
    ethtool 网卡名称

参考