linux和shell的学习记录

时间:2021-12-11 06:18:27

1.16条常用的命令

1.文件的权限修改:(把文件1.txt的归属改为mysql的,然后ll查看)
    chown mysql:mysql 1.txt
    
2.增加当前用户的x权限,然后ll查看:
    chomd u+x 1.txt

3.对比文件的差异:
    diff 1.txt 2.txt
    
4.查询文件位置:
    find ./ -name 1.txt
    
5.杀掉进程
    kill -9 9865
    
6.杀掉test用户下面的所有进程:
    ps -ef | awk '$1=="test"{print $2}'    | xargs kill -9
    
7.查看时间:
    date 
    
8.查看当前用户
    id
    
9.查看当前主机信息
    uname -a
    
10.使用root用户修改test用户密码:
    passwd test
    
11.磁盘空间信息
    df -h
        
12.查看当前所在目录
    pwd

13.标准输出,和print类似:
    echo '123'
    
14.查看文件前10行信息
    head -10 1.txt
    
15.查看文件后10行
    tail -10 1.txt
    
16.vi基本使用
    ESC后:
        x:删除一个字符
        dd:删除一行
    底行模式:
        设置行号:set nu
        查找:/字符

 

2.文件权限问题命令:

1.权限字符:
    分三列:所有者,所属组,其他
    r:读---4
    w:写---2
    x:执行---1
    
2.增加当前用户的x权限,然后ll查看:
    chmod u+x 1.txt
    
3.文件的权限修改:(把文件1.txt的归属改为mysql的,然后ll查看)
    chown mysql:mysql 1.txt
    
4.例如:-rw-r--r--. 1 root root         68 Mar 27 00:40 test.sh
    所有者:root 权限:rw
    所属组:root 权限:r
    但是所有者root可以使用:sh test.sh来执行这个文件,因为可读
    直接使用./test.sh执行不了,
    需要授权:chmod +x test.sh  即可执行
    
5.执行文件:(推荐./和sh的方式)
    有r:
        sh test.sh
        bash test.sh
        source test.sh
        
    有x:
        sh test.sh
        bash test.sh
        source test.sh
        ./test.sh  
    
6.sh的原理:
    读取文件的命令,然后执行文件里面的命令,所以只要有r权限就能执行

 

3.命令操作符号问题:

1.符号>
    删除文件内容追加新内容,经常和cat一起使用
    cat >1.txt
    回车然后输入内容
    
2.符号>>
    不删除文件内容追加字符,经常和cat一起使用
    cat >>1.txt
    回车然后输入内容
    
3.符号;
    执行多条命令
    cat 1.txt ; ls
    
4.符号|
    管道:| 表示管道,上一条命令的输出,作为下一条命令参数(输入)。
    cat 1.txt | grep 你好
    
5.符号&&
    前面的命令执行成功才执行下一条命令
    cat 1.txt && ls
    
6.符号||
    前面的命令执行不成功才执行下一条命令
    
7.符号""
    输出变量值
    echo "第一个变量是:$a"
    
8.符号''
    只会当成字符串输出
    echo '第一个变量是:$a'
    
9.符号``
    符号内解析为一条命令
    a='date' 为字符串   echo $a  结果为date
    a=`date` 为一条命令 echo $a  结果为时间
    
10.无底洞
    2>/dev/null  把错误的输出丢到无底洞,不会在控制台打印错误信息
    2>/dev/null     把正确的输出丢到无底洞,不会在控制台打印正确信息
    cat 1.txt 2>/dev/null 

 

4.运算符号问题:

1.输出表达式的三种方法:
    expr 12 + 2
    echo $[12 + 2]
    echo $((12 + 2))
    
2.使用bc计算器(字符串交给bc处理)
    echo "1.2+1.3" | bc            结果:2.5
    echo "scale=2;1.2+1.3" | bc    结果:2.5
    echo "scale=2;(1.2+1.3)/1" | bc    结果:2.50

 

5.判断运算的问题:

    -e    目标是否存在:    [ -e 1.txt ] || touch 1.txt
    -d    是否为路径    :     [ -d /docker ] && echo '存在' 
    -f    是否为文件
    
    -r    是否有r权限:    [ -r 1.txt ] && echo '有读权限'
    -w    
    -x
        
    整数:
    -eq    等于        [ 9 -eq 9 ] && echo '等于'
    -ne    不等于        
    -gt    大于        
    -lt    小于        
    -ge    大于或等于    
    -le    小于或等于    
    
    字符串:
    =    等于    [ 'ggg' = 'ggg' ] && echo '等于'
    !=    不等于    
    
    小数:通过bc计算器    [ `echo '1.2 > 1.3' | bc` -eq 1 ] && echo '大于'
    
    常用:
    [ $? -eq 0 ] 判断上一条命令是否执行成功

 

6.read命令:

read命令:
    -p 给出提示符
    -s 隐藏输入内容
    -t 给出等待时间,超时退出read
    -n 限制读取字符个数,超过临界值会自动执行
    

 

7.-e 的作用

-e :激活命令的作用:
    echo -e "\n"
    `echo -e "\033[4;31m 你好: \033[0m"`

 

8.处理海量数据;grep,awk,sed,cut

8.1grep:行操作

    -v :内容的取反
    -n :行号+内容
    -w :精确匹配
    -i :忽略大小写
    ^  :匹配行首
    -E :正则匹配
    
    在123.sh文件提取包含user的行内容
        grep 'user' 123.sh
        
    匹配以user开头的行
        grep '^user' 123.sh
        
    匹配包含user1或user2或user3的行
        grep -E 'user1|user2|user3' 123.sh

 

8.2cut:列操作

    -d :指定分割符(不加默认tab键分割)
    -f :指定截取区域
    -c :以字符为单位进行分割
    
    以':'为分割符,截取出123.sh文件第一列和第3列
    cut -d ':' -f 1,3 123.sh
    
    以':'为分割符,截取出123.sh文件第一列到第3列
    cut -d ':' -f 1-3 123.sh
    
    以':'为分割符,截取出123.sh文件第二列到最后一列
    cut -d ':' -f 2- 123.sh
    
    截取123.sh文件第二个字符到第五个字符
    cut -c 2-9 123.sh
    
    案例:
    领教教你截取所有可登陆系统的普通用户(除root)
    grep '/bin/bash' /etc/passwd | cut -d ':' -f 1 | grep -v 'root'
    cat /etc/passwd | grep 'bin/bash' | cut -d ':' -f1 | grep -v 'root'

  上述命令也可以用cat命令:
    cat 123.sh | cut -d ':' -f 1,3

 

8.3强大的awk:列操作

    awk [选项] '条件{执行动作} 条件2{执行动作} ..' 文件名
    选项和条件可以不写
    
    printf:格式化输出,不会自动换行
        \t:tab 
        \n:换行
        %ns:字符串  n表示字符串个数
        %ni:整型    n表示数字个数
        %.nf:浮点型 n表示小数点后个数
        printf '%s\t%s\t%s\t\%s\n' 1 2 3 4 5
        
    print:会自动换行
    
    例子:查看磁盘的使用率
        df -h | grep /dev/vdal | awk '{printf "/dev/vdal的使用率:"} {print $5}'
        
        浮点计算(最后的$0表示一整行)
            echo "scale=2; 0.13 + 0.1" | bc | awk '{printf "%.2f\n",$0}'
            
            $0:一整行
            $1:第一列
            $2:第二列
            ...
            
        
    条件:
        \F:指定分割符:
            cat /etc/passwd | cut -d ':' -f 1
            cat /etc/passwd | awk -F":" '{print $1}' 
        
        BEGIN:读取所有文件内容前执行,一般用于修改内置变量的值
        FS:BEGIN时定义分割符
            cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}' 
    
        END:结束时执行
            cat /etc/passwd | awk -F":" '{print $1} END{printf "以上为执行结果\n"}' 
    
        NR:行号
            df -h | awk '(NR>=2 && NR<=5) {print $5}'
            awk '(NR>=2 && NR<=5) {print $5}' /etc/passwd
        
        打印行号:
            nl /etc/passwd | awk '(NR>=2 && NR<=5) {print $1}' 
            
            

 

8.4sed:先取,新增,搜索,替换,删除

    sed [选项] [动作] 文件名
        选项和动作可以不写
    
        -n:把匹配到的行打印
        p:以行为单位进行查询,通常与-n一起使用
            打印第二行:
            df -h | sed -n '2p'
            打印包含2行:
            df -h | sed -n '/2/p'
            
            
        d:删除(不会对源文件修改的)
            删除第二行:
            df -h | sed '2d'
            把文本放到一个新的文件
            df -h > newdf.txt 
            sed '2d' newdf.txt
            
        a:在行的下面插入新的内容(不修改源文件)
            sed '2a 123456789' newdf.txt
            
        i:在行的上面插入新的内容(不修改源文件)
            sed '2i 123456789' newdf.txt
        
        c:替换
            把第二行替换
            sed '2c 123456789' newdf.txt
    
        s/str1/str2/g    str2替换str1
            sed 's/%0/100%/g' newdf.txt
        
        -i:对源文件进行修改(高危操作,必须先备份)
            sed -i 's/%0/100%/g' newdf.txt
        
        -e:表示可以执行多条动作
            比如搜索内容时替换和打印两个动作
            cat newdf.txt | sed -n -e 's/0%/100%/g' -e '/100%/'
            
    
    搜索内容的方法:
        sed -n '/100%/p' newdf.txt
        cat -n newdf.txt | sed -n '/100%/p'
        
    之前学过的grep搜索:
        cat -n newdf.txt | grep 100%

 

复习:

判断运算的问题 

    -e    目标是否存在:    [ -e 1.txt ] || touch 1.txt
    -d    是否为路径    :     [ -d /docker ] && echo '存在' 
    -f    是否为文件
    
    -r    是否有r权限:    [ -r 1.txt ] && echo '有读权限'
    -w    
    -x
        
    整数:
    -eq    等于        [ 9 -eq 9 ] && echo '等于'
    -ne    不等于        
    -gt    大于        
    -lt    小于        
    -ge    大于或等于    
    -le    小于或等于    
    
    字符串:
    =    等于    [ 'ggg' = 'ggg' ] && echo '等于'
    !=    不等于    
    
    小数:通过bc计算器    [ `echo '1.2 > 1.3' | bc` -eq 1 ] && echo '大于'
    
    常用:
    [ $? -eq 0 ] 判断上一条命令是否执行成功

 

运算符号问题:

1.输出表达式的三种方法:
    expr 12 + 2
    echo $[12 + 2]
    echo $((12 + 2))
    
2.使用bc计算器(字符串交给bc处理)
    echo "1.2+1.3" | bc            结果:2.5
    echo "scale=2;1.2+1.3" | bc    结果:2.5
    echo "scale=2;(1.2+1.3)/1" | bc    结果:2.50

 

9.循环:

9.1循环的if

1.  if [条件];
        then
        动作
    fi
    
    
2.  if [条件];
        then
        动作
    else
        动作
    fi
    
    例子:判断输入文件是否存在
        #!/bin/bash
        if [ -e $1 ];
                then
                echo "$1存在"
        else
                echo "$1不存在"
        fi

        
            
3.  if [条件];
        then
        动作
    elif [];
        动作
    fi    

    例子:判断输入的数字是否大于10
        #!/bin/bash
        echo '请输入一个数字:'
        read number
        if [ $number -eq 10 ];
            then
            echo "$number 等于10"
        elif [ $number -gt 10 ];
            then 
            echo "$number 大于10"
        else
            echo "$number 小于10"
        fi    

 

9.2循环的for

    1.格式:
        for 变量名 in 值1 值2 ....
        do
        动作
        done
        
        例子:打印1-10
        #!/bin/bash
            for i in 1 2 3 4 5 6 7 8 9 10
            do 
            echo $i
            sleep 1
            done
    
    
    
    2.格式
        for 变量名 in `命令`
        do
        动作
        done
        
        例子:打印1-100
            #!/bin/bash
            for i in `seq 1 100`
            do 
            echo $i
            done
        
        例子:ping两下baidu是否通,通则断开
            #!/bin/bash
            for i in $(cat a.txt)
            do 
            ping -c  2 $i
            echo -e "\n"
            done
        
        a.txt文件内容
        www.taobao.com
        www.qq.com
        
    3.格式:
        for ((条件))
        do
        动作
        done
        
        例子:打印1-10
            #!/bin/bash
            for ((i=1;i<11;i++))
            do
            echo $i
            sleep 1
            done

 

9.3循环的case:(匹配执行)

    1.格式:(;;表示执行完后结束)
        case 变量 in 
            值1 )
            动作
            ;;
            
            值2 )
            动作
            ;;
            
            值3 )
            动作
            ;;
            
            ...
        esac
    
    例子:查询城市天气
        echo '请输入城市'
        read city
        case $city in 
            '广州')
            echo "$city温度23,热"
            ;;
            '四川')
            echo "$city温度24,热"
            ;;
            '大良')
            echo "$city温度25,热"
            ;;
            *)
            echo "输入有误"
            ;;
        esac

 

9.4循环的while

    1.格式:
        while [ 条件判断式 ]
        do
        动作
        done
    
        例子:计算0加到n的和
            #!/bin/bash
            i=0
            sum=0
            while [ $i -le $1 ]
            do
            sum=$(($sum+$i))
            i=$(($i+1))
            done
            echo 'the sum is:'$sum