• linux shell操作- 02 常用命令及案例


    常用命令 续

    • linux发行版的工具
      • Ubuntu 包管理器 apt
      • CentOS包管理器 yum
      • OpenSUSE包管理器zypper
        • 包管理器使用
    # 在线安装
    zypper install sqlite3-devel
    # 查询
    zypper packages | grep -iE "tk-devel"
    # 下载rpm
    zypper download tk-devel=1.13
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • rpm软件包的安装
    # 查询已安装
    rpm -qa | grep -iE "libxcb-devel"
    # 安装
    rpm -ivh xxxx.rpm
    # 升级安装
    rpm -Uvh xxxx.rpm
    # 卸载
    rpm -ev xxx.rpm
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 路径切换管理

      • 两个目录间来回切换使用cd -
      • 多个目录来回切换,pushd入栈
        • pushd dir1;
        • pushd dir2;
        • pushd +0; 切到栈顶目录 ;
        • pushd +1; 从栈顶依次向下走一步;
        • popd 出栈;
    • 查看文件差异 diff;

      • diff -u version1 version2 > v.patch 查看差异
      • patch -p1 version1 < v.patch 修补版本1 ;需要安装patch包
         
    • 定时任务

      • 通过文本编辑cron任务,实现定时操作
        • 分 小时 天 月 星期 绝对路径sh or cmd
        • * 表示每个xxx,如每个小时
        • 每小时的第三分钟执行cmd-> 03 * * * * /home/lauf/scraw.sh
        • 每天的第5、8个小时执行-> 00 5,8 * * * cmd
        • 周日的每小时执行-> 00 */12 * * 0 cmd
        • 每天凌晨 -> 00 02 * * * cmd
        • 将任务写入 task.cron 文件中。
      • 执行定时任务 crontab task.cron
      • 或者 crontab <
      • crontab -e 直接编辑定时任务
      • crontab -l 查看定时任务
      • crontab -r 直接移除所有任务
      • crontab -u 操作某用户的任务
      • 案例
        • 01 * * * * ls -l /home/laufing > log.txt
    • 查看信息

      • hostname,查看主机名信息;编辑主机名vim /etc/hostname
      • cat /etc/hosts 查看本地地址映射;
      • uname -a,查看内核信息
      • cat /proc/cpuinfo cpu信息
      • cat /proc/meminfo 内存
      • cat /proc/partitions 分区
      • cat /proc/version 发行版
      • /proc 在内存中存储进程信息,每个数字目录为一个进程;
      • which cmd 可执行文件的路径;同whereis,搜索PATH
      • whatis cmd 查看功能信息
      • who 当前登录的用户;whoami 当前终端用户;users; last 上次登录信息; uptime系统已运行时间;
         
    • 进程管理

      • ps 查看进程信息;
      • ps -ef ; every process所有用户的进程 , f 字段格式
      • ps -axf; 所有进程(所有用户)
      • ps -axu 所有进程
      • ps -ef --sort ppid 查看所有进程,并根据ppid排序;
      • ps -ef -o pcpu -o pmem -o comm -o user; 只输出指定列
      • ps -C xxx ; 根据进程名称获取信息
        • ps -C mysqld; 获取mysql 服务进程信息
        • ps -C postgres;
        • pidof postgres;根据进程名称,获取所有的进程id;
        • pgrep postgres; 根据进程名称,获取所有的进程id;
        • ps -ef | cut -f 2 -d " " | xargs kill -9 获取进程id,并杀掉进程;
        • pidof postgres | xargs kill -9
      • ps -efL ; -L同时输出线程信息,LWP为线程id
      • top 查看进程的系统资源占用情况
        • top -o %CPU 按CPU降序;
        • top -o %MEM 按内存降序
      • linux进程间通信,使用信号kill 向进程传递信号
        • kill -l 查看所有的信号
          [laufing@centos ~]$ kill -l
        1. SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-461) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX
        • kill -s SIGKILL pid; 通过向进程传递SIGKILL信号 终止进程
        • kill -9 pid ;强制杀死进程
        • killall 类似pkill,根据进程名称杀死进程
        • Ctrl + C 向进程发送SIGINT信号;
        • 案例,编写一个脚本,使进程一直运行(事件循环), 关联处理函数与SIGINT信号,每次按Ctrl + C 打印输出。
    #!/bin/bash
    #handle function
    handler(){
      echo "ctrl + c pressed."
    }
    #associate
    trap "handler" SIGINT
    while true;do
            echo running... > log.txt
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 查看文件内容cat、head、tail
      • cat a.txt
      • cat a.txt b.txt > c.txt 查看并拼接内容
      • head -n 20 /etc/profile 查看前20行;
      • head -n -10 /etc/profile; -10表示后10行之前的内容;
      • tail -n 10 /etc/profile; 查看后10行
      • tail -n +10 /etc/profile; 查看前10行之后的内容
      • tail -f /etc/profile; 追踪新写入的内容;
      • tail --pid 123 与写入的进程同步;

     

    • wc 统计

      • wc -l test.sh ; 统计行数
      • wc -w test.sh;统计单词数
      • echo my name is jack | wc -w
      • wc -c test.sh 统计字符数
      • wc -L test.sh ;最长行的长度
    • tree 目录树

      • tree -h 查看文件树,并展示文件大小;
      • tree -h -o result.txt;-o 结果输出到文件中
      • tree -h -P test.sh ;-P 匹配文件
      • du -ah 磁盘文件的使用情况;
      • du -sh *;
      • df -h 磁盘的可用情况;

     

    • 正则匹配grep
      • grep 正则匹配,默认使用通配符模式,返回匹配到的行
      • -i 忽略大小写
      • -E 正则匹配模式 ,相当于egrep
      • -o 返回匹配的内容,默认返回匹配到的行
      • -v 匹配到的行以外的内容;
      • -c 统计匹配到的行数
      • -n 显示匹配到的行号
      • –color=auto/always 标注匹配内容颜色
      • -l 返回匹配到的文件列表;-L 返回未匹配到的文件列表
      • -e 指定多个匹配模式; -r 递归; -q 静默,匹配成功 $?为0,否则为1;
      • -Z 以0作为定界符;
      • 连带内容 -A 3 匹配的行 连带后三行; -B 2 匹配的行 连带前两行;-C 2 连带前、后两行
    # 匹配文件内容
    grep -iE -l  "^while" *.sh
    test.sh
    
    # 标准输入 中的匹配
    echo laufing | grep -i -e 'au' -e ng
    laufing
    
    # 递归搜素指定的文件
    grep -rn --include='*.sh' --include='*.txt' -e 'while' . # 指定目录
    ./test.sh:10:while true
    # --exclude=*.sh  排除指定文件
    # --exclude-from
    
    # 递归匹配 
    grep -Rn 'xxx' .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
     

    • cut 过滤字段
      • cut -f 3 result.txt ;获取文件中的第三列;
      • -d 指定定界符,默认为\t;
      • -f 指定第几列,从1开始;
      • -f 1 --complement ;第一列以外的列;
      • -c 1-5 ; 字符范围 作为列
        查看8010端口的进程,并根据pid杀掉所有进程
    # netstat -tnp
    lsof -i:8010 | cut -f 2 -d " " | xargs kill -9
    
    • 1
    • 2

     

    • 磁盘使用情况
      • df -h;可以空间 kb单位
      • du -h; 文件大小
        • -a 递归
        • -h 可读性
        • -c 统计
        • -s 总结
        • -b 以byte为单位
      • 找出指定的目录中,最大的十个文件,并降序输出
    # 总结
    du -sh /home/laufing/* | sort -nrk 1 | head  
    
    • 1
    • 2

    简单案例

    1. 编写shell脚本,输出当前用户是否为root用户。
    #!/bin/bash
    # 开启调试
    set -x
    
    # 数值比较 测试
    if [ $UID -eq 0 ]; then
    	echo "you are root."
    else
    	echo "you are common user."
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    添加可执行权限:chmod u+x lauf.sh

    1. 编写shell脚本,接收命令行参数 m 、 n,输出 m n {m^n} mn
    #!/bin/bash
    # 变量直接赋值,一切值均为字符串
    m=$1
    n=$2
    echo $m $n
    echo -e "calc result:\n" # -e 有转义字符
    echo "${m}^${n}" | bc
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 编写shell脚本,创建一个普通数组(‘tom’ ‘jack’ ‘lucy’),使用for循环遍历出每个元素。
    #!/bin/bash
    
    #!/bin/bash
    
    arr=('tom' 'jack' 'lucy')
    for((i=0; i < ${#arr[*]}; i++)){ # 数组长度
        echo ${arr[i]}  # 普通数组,索引访问 arr[@] / arr[*] 获取所有的元素
        echo ${#arr[i]} # 每个元素的长度
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 编写shell脚本,存储水果的价格,apple: 3.4,pear: 2.3,banana: 2.8;命令行传参一个水果的名字,输出它的价格。
    #!/bin/bash
    
    # 声明关联数组,支持字符串索引,相当于python字典
    declare -A price
    price['apple']=3.4
    price['pear']=2.3
    price['banana']=2.8
    
    echo "${price[$1]}"
    
    # 命令行执行
    $ ./lauf.sh  apple
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

     
    5. 编写shell脚本,查看当前目录下占用磁盘空间最大的5个文件,并自定义一个命令,名为lauf,命令行下执行lauf命令即可执行脚本。

    • du -ah 查看磁盘使用情况
    • alias 定义命令别名,防止输入过长。命令行下临时生效,配置文件中永久生效
    • 开启调试模式
      • sh -x lauf.sh
      • #!/bin/bash -xv
      • set -x 写在脚本语句中 set +x 关闭调试
    #!/bin/bash
    du -ah | sort -nrk 1 | head -n 5
    
    # sort 
    # -n 数值排序
    # -k 指定列
    # -r 逆序排序
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    6. 编写shell脚本,要求用户输入用户名、密码,其中输入密码时不允许显示,最后打印用户名及密码,并统计程序执行的时间。

    • read 获取用户的输入,如 read password, 读取内容并存入password变量;
      read -p “提示:”,
      read -s 静默输入,不显示,
      read -n 读取指定数量的字符
    • stty -echo 不允许显示; stty echo 允许显示;
    • date 获取日期时间,date  +%s 获取时间戳, date +%a星期, date +%d日期,date +%b月份, date +%y/Y年,date +%H小时,date +%M分钟,date +%S秒
    #!/bin/bash
    
    # 计算开始时间
    start=$(date +%s)   # (xxx) 子shell , 即子进程; $() 相当于``
    # 输入用户名
    read -p "input your name:" username
    # 不显示
    stty -echo
    read -p "input your password:" password
    # 显示
    stty echo
    
    # 输出
    echo "your name: $username"
    echo "your password: $password"
    # 计算结束时间
    end=$(date +%s)
    
    # 计算差值
    let delta=end-start
    echo "total time: $delta s."
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

     
    7. 编写shell,循环10次,每次延迟5s,计算程序执行总时间。

    #!/bin/bash
    start=$(date +%s)
    for i in {1..10}; do
    	sleep 5 # 休眠  命令行参数传入时间
    	echo $i
    done
    end=$(date +%s)
    
    delta=$[end-start]
    echo "total time: $delta s."
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

     
     
    上一篇: linux shell操作- 01 基础必备
    下一篇:linux shell操作- 03 用户切换及shell案例

  • 相关阅读:
    12月2日:thinkphp中数据库完结
    ARM系列 -- 虚拟化(五)
    【编程强训11】最近公共祖先+求最大连续bit数
    Shell基础语法——流程控制、函数
    使用线程池,并发计算1~50、51~100的和,再进⾏汇总统计。
    前端可视化大屏设置全屏模式方法
    PL/SQL基础知识点(一)
    HTTP 413 Request Entity Too Large(Payload Too Large)
    批量归一化(PyTorch)
    Android 音频框架之配置文件解析
  • 原文地址:https://blog.csdn.net/weixin_45228198/article/details/132927877