Linux

Posted by 盈盈冲哥 on June 21, 2020

Linux & Git入门

  • Linux日常用途:日常工作使用Mac、文档快速处理、登陆机器查看日志、检查机器运行情况

  • Linux文件结构

    • Unix/Linux基本哲学:一切皆文件
    • 优点:访问所有东西都对文件进行读写
    • /bin 二进制文件
    • /sbin 特权二进制文件
    • /home 普通用户目录
    • /opt 大型软件
    • /usr 安装程序
    • /var 经常变化的文件
    • /mnt 文件挂载目录
    • /etc 配置文件
    • /root 特权用户
    • /dev 抽象硬件
    • /boot 内核和启动文件
  • 文件权限控制

    • 第一个字符:文件类型
      • (-)文件,(d)目录,(l)软链,(s)套接字
    • 后面9个字符表示3组文件权限
      • (r)读,(w)写,(x)执行
      • 第一组:所有者
      • 第二组:所在组
      • 第三组:其他组
    • chmod 755 abc
    • chown username file dir(修改文件或文件夹的用户名)
    • chown -R username dir(修改文件夹中文件的用户名)
    • chown username:group file dir(修改文件或文件夹的用户名及用户组)
  • 开发工作常见命令

    • tar 打包压缩
      • -c 归档文件
      • -x 解压缩文件
      • -z gzip 压缩文件
      • -j bzip2 压缩文件
      • -v 显示压缩或解压缩过程
      • -f 使用档名
      • tar –cvf /home/abc.tar /home/abc 只打包,不压缩
      • tar -zcvf /home/abc.tar.gz /home/abc 打包,并用 gzip 压缩
      • tar -jcvf /home/abc.tar.bz2 /home/abc 打包,并用 bzip2 压缩
    • ls -l grep fastjson
    • 文件查找
      • which 查看可执行文件的位置
      • whereis 查看二进制文件、 说明文件、 源文件的位置
      • locate 配合数据库查看文件位置
      • find 实际搜寻硬盘查询文件名称
    • 文件内容
      • cat
      • head (-n k,显示文档开始的前k行,-k,不显示文档结尾的最后 k 行)
      • tail (-n k,显示文档结尾的后k行, +k,不显示文档最开始的 k 行) (-f 循环读取, 十分常用)
      • more 逐页阅读, 按空格显示下一页, 按 b 键往回一页显
      • less 逐步加载, 随意阅读
      • sort 以行为单位排序 (-r 倒序)
    • 日志:北京/opt/logs/log 上海/data/applogs 任意都可以
    • 文件处理指令
      • vim
        • gg 移动到文档开头
        • G 移动到文件末尾
        • Ctrl+f 向下翻页
        • Ctrl+b 向上翻页
        • /{word} 从光标之下查找下一个匹配的字符串, 按n重复上一个查询指令
        • ?{word} 从光标之上查询上一个匹配的字符串, 按n重复上一个查询指令
      • grep 匹配
      • awk 字段处理
        • $0 一行
        • $1, $2, $3… 第几列
        • 列分隔符FS, 默认为空格
        • 行分隔符RS, 默认为换行符
        • 行号NR
        • 列数量NF
        • 常见用法 awk ‘{[pattern] action}’ {filenames}

          awk –F: ‘{print $1}

      awk、uniq、sort三个命令的基本用法

      • uniq 去重
        • -c 显示输出中,在每行行首加上本行在文件中出现的次数
        • -d 只显示重复行
        • -u 只显示文件中不重复的各行
        • -n 前n个字段与每个字段前的空白一起被忽略
        • +n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)
        • -f n与-n相同,这里n是字段数
        • -s n与+n相同,这里n是字符数
        • 常用: uniq -c 首行显示文件中出现的次数
      • sort 排序
        • -u 在输出行中去除重复行
        • -r 默认的排序方式为升序,-r转换为降序排列
        • -n 默认按照字符来排序出现10在2前面,-n以数值来排序
        • -t 后面设定间隔符
        • -k 指定列数
        • 如:sort -n -k 2 -t : test.txt 以数值排序,按照第二列以“:”间隔来排列顺序
  • 运维工作常见指令

    • avartar或plus看日志不稳定,跳板机更好
    • 文件上传和下载:SFTP put get 文件
    • python -m SimpleHTTPServer 8411(8411~8419),不要忘记关进程
    • ps
      • -A 列出所有进程
      • -au 显示较详细的信息
      • -ef 显示所有进程信息, 连同命令行
    • cpu: top, sar -u
    • 内存: top, free -h, sar -r
    • 磁盘指令: df -h, du -sh, sar -d
    • 网络指令: ping, telnet, sar -n

Shell

Shell 编程入门

Shell 教程

  1. 1
    
    chmod +x ./test.sh  #使脚本具有执行权限
    

    不能写成test.sh,因为会去PATH里找。

  2. 使用变量

    $变量名

    ${变量名}

    1
    2
    3
    4
    5
    
     #!/bin/bash
     #自定义变量hello
     hello="hello world"
     echo $hello
     echo  "helloworld!"
    
  3. 字符串

    字符串可以用单引号,也可以用双引号

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
     #!/bin/bash
     name="SnailClimb"
     # 使用双引号拼接
     greeting="hello, "$name" !"
     greeting_1="hello, ${name} !"
     echo $greeting  $greeting_1
     # 使用单引号拼接
     greeting_2='hello, '$name' !'
     greeting_3='hello, ${name} !'
     echo $greeting_2  $greeting_3
    

    输出

    1
    2
    
     hello, SnailClimb ! hello, SnailClimb !
     hello, SnailClimb ! hello, ${name} !
    

    使用 expr 命令时,表达式中的运算符左右必须包含空格,如果不包含空格,将会输出表达式本身:

    1
    2
    3
    4
    
     expr 5+6    // 直接输出 5+6
     expr 5 + 6       // 输出 11
     expr 5 * 6       // 输出错误
     expr 5 \* 6      // 输出30
    

    字符串长度

    1
    2
    3
    4
    
     # 第一种方式
     echo ${#string}
     # 第二种方式
     expr length "$string";
    

    字符串截取

    echo ${string:1:4}

  4. 数组

    1
    2
    
     array_name=(value0 value1 value2 value3)
     valuen=${array_name[n]}
    

    数组中的所有元素

    1
    2
    
     ${my_array[*]}
     ${my_array[@]}
    

    获取数组的长度

    1
    2
    
     ${#my_array[*]}
     ${#my_array[@]}
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
     #!/bin/bash
     array=(1 2 3 4 5);
     # 获取数组长度
     length=${#array[@]}
     # 或者
     length2=${#array[*]}
     #输出数组长度
     echo $length #输出:5
     echo $length2 #输出:5
     # 输出数组第三个元素
     echo ${array[2]} #输出:3
     unset array[1]# 删除下标为1的元素也就是删除第二个元素
     for i in ${array[@]};do echo $i ;done # 遍历数组,输出: 1 3 4 5 
     unset arr_number; # 删除数组中的所有元素
     for i in ${array[@]};do echo $i ;done # 遍历数组,数组元素为空,没有任何输出内容
    
  5. 关系运算符

    1
    
     -eq, -ne, -gt, -lt, -ge, -le
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
     #!/bin/bash
     score=90;
     maxscore=100;
     if [ $score -eq $maxscore ]
     then
       echo "A"
     else
       echo "B"
     fi
    
  6. 布尔运算符

    1
    2
    3
    
     ! # 非
     -o # 或
     -a # 与
    
  7. 字符串运算符

    1
    2
    
     = # 判断两个字符串是否相等
     != 
    
  8. for循环

    1
    2
    3
    4
    
     for loop in 1 2 3 4 5
     do
         echo "The value is: $loop"
     done
    
    1
    2
    3
    4
    5
    
     #!/bin/bash
     for i in {0..9};
     do 
       echo $RANDOM;
     done
    

    通常情况下 shell 变量调用需要加 $,但是 for 的 (()) 中不需要

    1
    2
    3
    4
    
     #!/bin/bash
     for((i=1;i<=5;i++));do
         echo $i;
     done;
    
  9. while循环

    1
    2
    3
    4
    5
    6
    7
    
     #!/bin/bash
     int=1
     while(( $int<=5 ))
     do
         echo $int
         let "int++"
     done
    
  10. 函数

    1
    2
    3
    
     echo "第一个参数为:$1";
     echo "参数个数为:$#";
     echo "传递的参数作为一个字符串显示:$*";
    

    $*$@的区别:如果传入3个参数,$*是一个参数,$@是3个参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
     #!/bin/bash
     funWithReturn(){
         echo "输入第一个数字: "
         read aNum
         echo "输入第二个数字: "
         read anotherNum
         echo "两个数字分别为 $aNum$anotherNum !"
         return $(($aNum+$anotherNum))
     }
     funWithReturn
     echo "输入的两个数字之和为 $?"
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
     #!/bin/bash
     funWithParam(){
         echo "第一个参数为 $1 !"
         echo "第二个参数为 $2 !"
         echo "第十个参数为 $10 !"
         echo "第十个参数为 ${10} !"
         echo "第十一个参数为 ${11} !"
         echo "参数总数有 $# 个!"
         echo "作为一个字符串输出所有参数 $* !"
     }
     funWithParam 1 2 3 4 5 6 7 8 9 34 73