天天看点

Linux 命令介绍

最近阅读《Linux命令与Shell脚本编程大全》,重新学习了一下Linux基础,对一些常用的命令进行了笔记。

有幸刚毕业的时候就接触到了Linux,对一些常用的命令相对比较熟悉。如今工作中用到Linux的机会不是很多,

重新学习一下,加深理解,以便对后边Linux相关的学习有所帮助。

1.常用命令

    ln    sourceFile  destinationFile    创建硬链接文件

     ln -s sourceFile destinationFile  创建软连接文件,源文件删除 软连接文件不可用

    df     查看挂载磁盘的信息(物理空间,可用空间,剩余空间等)    -h  以M为单位

    du    查看当前目录下的文件和子目录所占空间大小

    ps  -ef  查询某刻正在运行的进程,并以完整格式显示出来

    ps -l     查询某刻正在运行的进程,并以长格式显示出来

    top     动态显示正在运行的进程

    top -Hp pid  显示该进程下的所有线程

2.内建命令,外部命令命令区分

    type  [-a]  +命令   查看该命令是内建命令还是外部命令

    外部命令需要生成子进程来执行,因此,相比之下 内建命令速度快,效率高

3.命令列表,进程列表区分

    命令列表;  pwd ; ls ; cd ; ....      不会生成子shell

    进程列表: (pwd ; ls ; cd ; ....)     会生成子shell

    bash  命令会生成子shell

4.后台进程

    命令 + &   该命令在后台进行   会生成一个 作业号 和进程id 如:

    sleep 20&       

    [1]  2184

    可以通过pe -ef   或 jobs进行查看

5.协程

    协程: coproc  不仅会创建子shell,还会进入后台模式

    coproc  sleep 10

    [1] 2544

6.history命令

    history   查询使用过的命令

    存放在 .bash_history文件中

7.查询已定义变量

    set  vs  env/printenv

    set :显示全局变量/局部变量/用户自定义变量

    env/printenv:只显示全局变量     printenv HOME 可以输出单个变量的值

8.变量相关

    变量名=value  

    unset + 变量名   删除环境变量

    echo $变量名    输出环境变量

    export  变量名   将变量设为全局变量  可以在子shell中使用,子shell修改删除此全局变量,仅在子shell中生效,父shell依然能访问

    变量永久化:将变量的声明和赋值写在.bashrc启动文件中

9.系统重要配置文件

    系统全局变量 :/etc目录

    profile,  .bash_profile, .bash_login,  .bashrc,  .profile   

    profile文件是bash shell 默认的主启动文件,每个用户登录都会执行这个启动文件

    另外四个文件针对用户

    $HOME目录下的启动文件

    .bash_profile,  .bashrc,  .bash_login,  .profile

    大多数Linux发行版只用到了以上一到两个

    shell 会按照以下顺序读取

    .bash_profile

    .bash_login

    .profile

    没有.bashrc的原因: 该文件通过其他文件运行

    $HOME 表示某个用户的主目录,和~的作用一样 

10.数组

    数组:   arr=(one two three)

    echo $arr     结果 one

    echo ${arr[1]}  结果two    注意括号

    echo ${arr[*]}  结果 one two three

    unset ${arr[1]}   echo ${arr[*]}  结果  one    three

    unset arr  删除数据变量

11.用户,组

    管理用户:

    useradd   userdel  usermod

    useradd username 增加用户

    passwd username    修改密码

    userdel  username   删除用户信息,不会删除文件   -r  删除对应文件目录

    usermod username -l(L小写)  newusername  改变用户登录名

    usermod username -L 锁定账户  -U接触锁定

    管理组:

    groupadd  groupmod

    文件  全权限  666   减去 unmask 022   默认权限 644

    目录  全权限  777  减去  unmask 022  默认权限  755

    unmask   026  设置 需从对象减去的默认权限

    设置文件权限:

    八进制模式

    chmod  760  filename

    符号模式:

    chmod [ugoa] [+-=] [rwxXstugo....]

    chown  [u][u.g][.g]  filename  更改文件属主,属组   .或者:

    chgrp  g filename 更改文件属组

    echo  

    -n  将文本字符串和命令输出显示在同一行

12.命令替换:

    将命令输入复制给变量   方式:  1)var1=`date`  2)var1=$(date)

13.重定向:

    输出重定向: >      用例:echo hello world > b.txt

    输出追加重定向: >>

    输入重定向: <     用例:cat < b.txt

    内联输入重定向:<<   用例: cat << EOF

    > hello

    > morning

    > bye

    >........

    > EOF

14.管道:  |

    用例:  cat b.txt | sort

15.数学运算: 

     expr   1 + 5   (运算符与值之间必须有空格, 特殊符号 用\转义  \*)   相当于一个命令输出

    可以使用变量   expr  $var1 + $var2

    $[1+6]   相当于 数学运算 + 命令替换 ,给变量赋值   运算符与值可以没有空格  只支持整数运算

    可以使用变量  $[$var1 + $var2] 

16.bc计算器:  可以计算浮点数

    用例: [[email protected] Documents]$ bc

    bc 1.06.95

    Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.

    This is free software with ABSOLUTELY NO WARRANTY.

    For details type `warranty'. 

    2.2*2

    4.4                                                  //计算结果

    3.250 * 4

    13.000

    scale=4;3+3

    6

    1/3

    .3333

    scale=5                        //设置小数位数

    1/3

    .33333

    双括号((condition))  可以是任意数学赋值或比较表达式 ,如>>, <<, **(幂乘),...

    双方括号[[condition]]  支持字符串的高级特性,模式匹配,如 if [[ $USER == r* ]] ,USER变量是否以r开头

    $?   上一条以执行命令的状态码 0~255 ,如果退出状态码超出255  则会模256

    命令成功执行 $? 输出为0

    shell脚本以最后一个命令的退出状态码退出

    exit  指定状态码

    用例:  var1=300

    exit $var1

17.结构化命令:

    1)if语句:    只有当if后边的命令退出状态码为0 才执行then后边的语句

     格式 :  

    if  commands                          if commands; then

         then                         commands

            commands                  fi

     fi

2)if  else语句

    if commads

    then

    commands

    else

    commands

    fi

3)if elif语句

    if commands

    then

    commands

    elif commands

    then

    commands

    else

    commands

    fi

18.test测试命令    

    范围:整数(-eq,-ge,-gl,-le,-lt,-ne),字符串(=,!=,>, <,-n 长度非0,-z 长度为0  ‘’或未定义的变量长度为零),文件(-d, -e(文件/目录是否存在),-f,-r,-s(文件内容是否非空),-w,-x,-O(文件是否属于当前用户所有),-G(文件默认组是否与当前用户相同), file1 -nt file2 (file1是否比file2新), file1 ot file2(文件file1 是否比file2 旧))

    字符串比较时,  > , <  必须用\转义,否则当重定向处理

    test命令  中的条件成立 ,退出状态码为0,否则退出状态码非0

    if test condition

    then

    commands

    fi

    等价于:

    if [ condition ]                   //方括号 必须与 内部的条件留有空格

    then

    commands

    fi

19.case用法:

    case  variable in

    pattern1 | pattern2)  commands;;

    pattern3) commands;;

    *)  commands;;

    esac

20.for用法:

    for var in  option

    do

      commands

    done

    option: 1) var1 var2 var3 var4   用空格分开

         2) $var   变量    

         3) $( cat filename  )    命令替换

         4)  /bin/* /etc/passwd   通配符读取目录

    C语言风格的for

      for (( a=1,b=10; a <= 10; a++,b--))

    do

    commands

    done

21.内部字段分隔符IFS

    默认情况下 bash shell 会将空格,制表符,换行当做字段分隔符

    IFS=:;“   改变IFS默认值,  $'\n'换行符专用

22.while用法:

     多条命令 必须换行, 且以最后一条命令的退出状态码为准,为0执行循环语句

    while  test condition1

    condition2

    do

    commands   #如需计算赋值 记得用 $[]  或 expr方式

    done

23.until用法:

    多条命令 必须换行, 且以最后一条命令的退出状态码为准,为非0执行循环语句

    until test condition1

    condition2

    do

    commands

    done

24.退出循环: 

    break n:  默认break  退出一个循环   n指定退出几个循环

    continue n: 默认 continue 退出一个循环的当前循环   n指定退出的循环数

25.位置参数: 

    $0,$1,$2.....${10},${11} 跟在脚本后边

    $0  返回脚本名(可能会带有全路径或者命令./)

    basename $0  返回脚本名(不会带有全路径)

26. $* VS [email protected]

    $#  返回命令行参数的个数

    $*  [email protected]   返回命令行所有参数

    $*  会将所有参数当作一个字符串

    [email protected] 会将所有参数当作统一字符串的不同单词

    可用for循环 遍历  for param in "$*"   注意 引号

27.对循环的输出进行管道或重定向:

   在done命令之后添加| 或者 > 

   也可以使用输入重定向<  将内容传送个循环条件

28.read命令

    read 读取用户输入

    read -p 命令行显示提示

    read -t   设置超时时间

    read -s  命令行输入,但不显示在控制台(如密码)

    read -s -t 3 -p "echo your name:"  [parameterName]

    echo  your name is $REPLY   //如果parameterName 为空  默认赋值给REPLY

29.shift  命令

    向左删除位置参数 

    sh  test.sh  a b c d   

     $1 是 a    shift 之后 $1 是b

30.文件描述符:

     0:标准输入   1:标准输出  2:错误输出

    cat test1 > test2   将正常信息输入到test2

    cat test1 2> test2 将错误信息输入到test2

    cat test1 2>test2  1>test3 将正常输出输到test3,将错误信息输到test2

    cat test1 &> test2 将正常输出和错误信息输到test2

    cat test1 >> test2 将正常输出追加到test2 

31.脚本中使用重定向:

1)临时重定向  

    test.sh中:

    #!/bin/bash

    echo "msg ouput in redirect test file" >&1

    echo "error msg output in redirect test01 file" >&2

    echo "end message ouput in terminal" 

    执行: sh test.sh 1> corrFile  2> errFile

    corrFile内容:

    msg ouput in redirect test file

    end message ouput in terminal

    errFile内容:

    error msg output in redirect test01 file

    结论:默认标准输出  所以corrFile中有两条数据

2)永久重定向  exec命令

     标准输出及错误输出案例

    redirect02.sh内容:

    #!/bin/bash

    exec 1>corrFile

    exec 2>errFile

    echo "corr message ouput in corrFile";

    echo "err message ouput in errFile" >&2;

    执行sh redirect02.sh

    corrFile内容:

    corr message ouput in corrFile

    errFile内容:

    err message ouput in errFile

     标准输入案例

    #!/bin/bash

    redirect03.sh内容:

    exec 0< content

    count=1;

    while read line        #从文件中读取

    do

      echo $count line: $line

      count=$[ $count + 1  ]

    done

    执行 sh redirect03.sh

    控制台输出:

    1 line: English

    2 line: Chinese

    3 line: Japanese

    4 line: Indian people

      自定义重定向   数字 3-8可供使用   0标准输入 1标准输出 2错误输出

                redirect04.sh内容:

     #!/bin/bash

    exec 5> corrFile

    echo "This is my defined command" >&5

    执行 sh redirect04.sh

    corrFile内容:

    This is my defined command

    恢复已重定向的文件描述符

         redirect05.sh内容:

    #!/bin/bash

    exec 3>&1

    exec 1> corrFile

    echo "hello everybody"

    exec 1>&3

    echo "I'm back"

    执行 sh redirect05.sh

    corrFile 内容:

    hello everybody

    控制台输出:

    I'm back

    可使用3-8等供使用的文件描述符  记住之前的重定向文件符进行恢复  1>&3 必须挨着写

    同理:  输入重定向恢复    exec  6<&0

                                           exec   0<   content   

      ....

    exec 0<&6 

     读写文件描述符  exec 5<> test.txt    

    写的内容会覆盖原来的内容     read  line <$4       <$4必须加上,因为不是标准输入,read默认从标准输入STDIN读取

     关闭文件描述符&-: 案例   exec  3>&-  

    关闭之后 重新启用该文件描述符,操作同一个文件 如有输出会内容覆盖

     阻止信息输出   案例  ls -al  >  /dev/null

     清空文件   cat /dev/null > test.txt

32.创建临时文件

     创建本地临时文件  mktemp  filename.XXXXXX   

    6个大写的X不能少  执行命令之后会输出文件全路径     1.dO7w7u

     mktemp -t  filename.XXXXXX  会在系统的临时目录/tmp 穿件

     穿件临时文件夹  mktemp -d dir.XXXXXX

33.记录消息:tee

    会将消息显示在标准输出的同时,还会在指定文件保存一份

    date | tee test.txt

    控制台:  Sun Jan 17 06:33:37 PST 2021

    test.txt内容:Sun Jan 17 06:33:37 PST 2021

    tee  -a  test.txt 追加内容

34.捕获信号 trap:  

    trap  commands  signals

    以SIGINT为例, ctrl+c会触发SIGINT信号

    cat trapScript.sh   

    #!/bin/bash

    trap "echo sorry, you can\'t stop script" SIGINT

    for ((  i = 0; i < 5; i++  ))

    do 

        sleep 3

        echo $i

    done

    将捕获所有的ctrl+c 命令  脚本继续运行  trap - SIGINT  恢复默认行为,也是终止脚本

35.后台模式运行 &

    运行脚本会生成一个作业号:

     sh trapScript.sh &

    [1] 5100

    [***@localhost myscripts]$ 0

    1

    2

    3

    4

    后台脚本的STDOUT,STDERR消息会显示到控制台  终端回话退出,后台脚本也会退出

36.nohup命令

    nohup + command  允许命令在退出终端后继续执行

    nohup: 脚本不会随着终端回话退出而退出

    hohup   sh trapScript.sh &   

    会将STDOUT  STDERR消息显示到当前目录的nohut.out文件中

37.查看作业: jobs

    jobs  -l 会显示作业号 

    -p  只列出作业的PID

    -r  只列出运行中的作业

    -s  只列出已经停止的作业

38.作业相关

    ctrl+z  停止作业   

    bg  + 作业号   以后台的形式重启作业

    fg  +  作业号   以前台的形式重启作业

39.优先级

    设置优先级: -20~19  值越小优先级越高  默认为0

    nice -num  command  设置num优先级   普通用户只能降低优先级

    renice 可以设置运行中进程的优先级  renice -num -p pid 将pid的优先级设为num

40.定时任务:

    at  vs cron

    at:

    at [-f filename] time   -f读取文件名

      例如: at -f xx.sh now

    cron:

    min hour dayofmonth month dayofweek command

    cron 允许使用特定值,取值范围(1~5),通配符 *

    at命令在预设的时间运行脚本;cron程序定期运行脚本

41.函数:

格式:

1)function   name(){commands}

2)name(){commands}

    shell中 用return 给函数返回特定的状态码 模256,只能是数值

    函数返回字符串:

    fun4(){

        echo hello

    }

    result=$(fun4)

    2.函数传参数

    fun5(){

         echo $[ $1 + $2 ]

    }

    result=$(fun5 1 2)

42.函数局部变量   local + name 

43.函数库:

    将多个函数定义在一个文件中,脚本中调用时首先得引用函数库

    . ./functions 或 source functions   (函数库和脚本在同一目录下)

    例如: 库函数 cat funLibscript.sh

    #!/bin/bash 

    function add(){

     echo $[ $1 + $2 ]

    }

    multiply(){

    echo $[ $1 * $2 ]

    }

    divide(){

    echo $[ $1 / $2 ]

    }

    minus(){

    echo $[ $1 - $2 ]

    }

    测试:

    #!/bin/bash

    source ./funLibscript.sh

    value1=12

    value2=4

    addResult=$(add value1 value2)

    echo "add result is $addResult"

    mulResult=$( multiply value1 value2 )

    echo "multiply result is $mulResult"

    divideResult=$(divide value1 value2)

    echo "divide result is $divideResult"

    minusResult=$(minus value1 value2)

    echo "minus result is $minusResult"

    echo -e  识别 \t 等符号

    echo -en 去掉末尾的换行符

44.sed 行编辑器  不会改变原文件中的数据

   1. sed options script file

    -e  使用多个编辑命令

    -f  使用脚本中的编辑命令,如果编辑命令较多,可以放入一个脚本中

    sed编辑器会将指定的命令应用到STDIN输入流上,可以通过管道输入给sed编辑器进行管理

    echo 'hello world' | sed 's/world/xindanding/'  将world用xindanding替换,最后的/不能省, 多个命令 单引号不能省

    2.处理文件  

    sed 's/world/xindanding/'  sedContent  将文件中的每行的第一个world用xindandin替换

    3.多个编辑命令 

    sed -e 's/world/xindanding/;s/black/white' sedContent 将文件中每行的第一个替换

    4.使用脚本

    sed -f sedCommand.sed sedContent   

    cat sedCommand:

    s/world/xindanding/

    s/black/white/

    5.替换标记

    s/pattern/repacement/flags

    默认只替换每行的第一个

    数字: 表名新文本将替换第几处模式匹配的地方

    g:表名新文本将替换所有匹配的文本

    p:将原先的文本内容打印出来

    w file:将替换结果写到文件中

    6.使用地址:

    数字方式寻址

    sed '2s/dog/cat/' data1.txt

    只修改第二行的文本,同理  2,3s/.... 修改2-3行的文本,2,$s/..修改从第二行到最后一行的文本。

    sed '2{

    s/fox/elephant/

    s/dog/cat/

    }'  data1.txt

    命令分组

    使用模式匹配

    sed '/xindanding/s/cat/dog/'  data1.txt

    对匹配xindanding的行 进行替换

    7.删除行,不会修改原始文件

    sed 'd'  data1.txt

    删除所有的行   sed '3d' data.txt 删除第三行  '2,3d',  '2,$d'同理

    sed '/xindanding/d' data1.txt

    删除匹配的行

    8.插入行

    insert:  在指定行之前插入

    echo 'hello world' | sed 'i\ xindanding'

    输出:  xindanding

       hello world

    对于文本文件可以指定行  3i,等等   反斜杠可以不加 识别第一个i字符

    append: 在指定行之后插入

    echo ‘hello world’ | sed 'a\xindanding'

    输出: hello world

    xindanding

    9.修改行

    sed '3c\ hello' data1.txt

    第三行用hello代替

    sed ‘/xindanding/c\ hello’ data1.txt

    匹配xindanding的行 用hello代替

    10.转换命令  

    sed ‘y/123/789' data1.txt

    全局的,不只针对一行  会对转换的字符一一对应,7替换1,8替换2....  

45.gawk : 

     gawk options script file

    -F  指定行中字段分隔符

    -f 从指定文件中读取程序

    gawk程序必须放到{}中,如果脚本是单个文本字符串,还需要用‘’单引号包裹

    gawk '{print "hello world"}'  没有指定文件名 默认从STDIN中接收

    数据字段变量

    $0 代表整个文本  $1代表第一个数据字段  $2代表第二个数据字段....

    gawk '{print $1}' gawkContent  

    默认识别空格和制表符  输出每行的第一个字段

    gawk -F: '{print $1}' gawkContent  

    以:作为分隔符

    在脚本中使用多个命令

    echo "my name is joke" | gawk '{$4="xindanding";print $0}'

    my name is xindanding

    xindanding必须用引号包含

    使用脚本

    gawk -f gawkCommand.gawk gawkContent 

    cat gawkCommand

    {print $1 , $2}

    处理数据的前后运行的脚本 ,区分大小写

    BEGIN ‘{}’   处理数据前运行的脚本

    END '{}'  处理数据后运行的脚本

    gawkCommand.gawk:

    BEGIN{print "starting...."}

    {print $1,$2}

    END {print "end...."}

    运行:

    [[email protected] myScripts]$ gawk -f gawkCommand.gawk gawkContent 

    starting....

    One line

    Two line

    Three line

    end....

46.网络连接方式:

1.桥接:

客户机就相当于真是主机。可以访问互联网,设置IP,互相访问。

如果没有网络,主机之间无法连接。

2.NAT: 网络地址转换

client和宿主机形成网络,客户机可以访问互联网,由宿主机做

DNS和NAT,IP也是由宿主机分配,客户机无法访问网络中的其他主机

没有网络的情况下,宿主机和客户机仍然是连通的,但客户机不能修改IP

3.Only host: 和NAT非常相似,只不过,client机不能访问互联网

继续阅读