• linux笔记:MOOC Linux开发环境及应用


    1. linux入门

    1.1 实用程序

    1. man:查询联机手册

      man (section) name	# section:1命令,2系统调用,3库函数,5配置文件(因为可能有同名的)
      man -k regexp	# 用正则匹配
      
      • 1
      • 2
    2. date获取时间和日期

      date "+%Y-%m-%d %H:%M:%S Day %j"	# 格式控制字符串必须以+号开头
      
      • 1
    3. bc:计算器

      bc -l	# 类似于ipython的交互式界面
      
      • 1
    4. 重定向

      ls -l > filelist.txt	# 输出重定向
      sort < filelist.txt		# 输入重定向
      ls -l >> filelist.txt	# 追加内容
      
      • 1
      • 2
      • 3
    5. 管道

      ls -l | sort # 将ls的stdout作为sort的输入
      
      • 1
    6. more, less:逐屏显示(文件或输出),less可以向上翻页但是more不行

      less -Nm	 # fb翻页,du翻半页,gG第一/最后一行,v编辑,/?向下或上搜索字符串(nN上一个下一个)
      
      • 1
    7. cat:列出文件内容;od:逐字节打印

      cat -n test.txt
      cat > file.txt # 没有命令行参数,从stdin获取输出,直到Ctrl-D,将内容写入文件
      
      • 1
      • 2
    8. head, tail

      head -n 20 file.txt 	# 显示前20行
      hand -n -20 file.txt	# 除了尾部20行,其余算头并显示
      tail -f file.txt		# 实时打印文件尾部追加的内容
      
      • 1
      • 2
      • 3
    9. tee:三通,将stdin输出到stdout,同时写入文件中

      ls -lh | tee out.txt
      
      • 1
    10. wc

      • -w:字计数
      • -l:行计数
      ps -ef | wc -l	# 查看当前进程总数
      ls | wc -w # 查看当前文件夹下文件个数
      
      • 1
      • 2
    11. sort

      • -r:降序
      • -o:结果覆盖原文件
      • -n:按照数字而非字符串排序
    12. tr str1 str2替换字符串,将stdin中str1的字符替换为str2的字符,然后标准输出

      cat file.txt | tr '[a-z]' '[A-Z]'	# 将file.txt文件中小写字母替换为大写字母
      
      • 1
    13. unique:筛选文件中重复的行

    1.2 了解系统状态

    1. who:确定谁在系统中

      tty # 输出当前终端设备文件名
      who am i 	# 输出当前终端上的登录用户
      
      • 1
      • 2
    2. uptime:已开机时间

      当前时间 开机时间 用户数量 CPU负载(1,5,15分钟内有几个进程在等待调度运行)
      
      • 1
    3. top:列出资源占用排名靠前的进程

      top -d 1 -n 5	# delay=1, 运行5次
      当前时间 开机时间 用户数量 CPU负载
      任务(进程)
      PID USER PR NI VIRT进程虚拟地址空间 RES驻留内存数(占用物理内存数) SHR共享内存数 %CPU %MEM TIME+占用CPU的时间 
      
      • 1
      • 2
      • 3
      • 4
    4. ps:查询进程状态,列出当前终端上启动的进程

      • -e:列出系统中所有进程
      • -f:以full格式列出
      • -l:以long格式列出
      UID PID PPID C(最近几秒占用CPU情况) PRI优先级 SZ进程逻辑地址空间 WCHAN进程在何处睡眠 TTY终端名字 TIME累计占用CPU时间 CMD
      
      • 1
    5. free:了解内存使用情况

      内存总量 已使用内存 空闲内存 共享内存 缓冲使用的内存 现在实际可以使用的内存
      
      • 1
    6. vmstat:了解系统负载

      vmstat 1 -Sm # 每一秒更新一次
      最关注的是cpu使用率,us=user, sy=system, id=idle, wa=wait for disk IO
      
      • 1
      • 2

    2. 正则表达式

    2.1 元字符

    正则表达式与文件名通配符规则不同

    • .:匹配任意单字符

    • *:匹配前面单字符0次或任意多次

    • [:方括号内的字符为集合,表示其中任意一个,方括号内的. * \ 表示自己,[ ][ ]表示左右中括号的两个字符,-表示一个区间(如果在最后则不表示区间)

    • \

    • ^:在中括号内时开头表示补集,[^a-z]表示匹配任一非小写字母(如果不在中括号内开头则不表示补集),在正则表达式开头时表示首部的限制(不在首部则不表示此限制)

    • $:在正则表达式尾部时表示尾部的限制(不在尾部则不表示此限制)

    2.2 正则表达式拓展

    • ():分组
    • |:逻辑或
    • +:匹配前面单字符1次或任意多次
    • ?:匹配前面单字符0次或1次
    • {m,n}:匹配前面的单字符m到n次
    • {m}:匹配前面的单字符m次
    • {m,}:匹配前面的单字符至少m次
    • \d:数字, \D:非数字,\s:空白符(包括换行), \S:非空白符(不包括换行), \w:数字字母下划线(相当于 [A-Za-z0-9_])

    2.3 常用命令

    1. grep -n 模式 文件名列表

      • -F:按字符串搜索(同fgrep)

      • -G:基本正则语法,默认

      • -E:拓展正则语法(同egrep)

      • -n:显示行号

      • -o:提取匹配的部分

        grep -n 'main' *.cpp	# 从文件中筛选
        ps -ef | grep -n '^zhang'	# 从输入中筛选
        
        • 1
        • 2
    2. sed:利用正则表达式处理文本(替换、删除等)

      sed 's/^zhang/ZHANG/g'	# 将开头为zhang的替换为ZHNAG,s表示替换,用/划分不同的部分,g表示如果有多个符合则全部替换
      
      • 1
    3. awk:逐行扫描进行条件判断,满足条件执行动作

      awk入门教程 - 阮一峰

    3. 文件编辑

    3.1 vim常用操作

    vim常用操作

    3.2 常见问题

    1. vim编辑结束后Ctrl+S:Linux进入了流量控制状态,Ctrl+Q流量控制解除

    2. Ctrl+Z导致进程挂起(进程还在但是处于Stopped状态):使用jobs命令查看当前Stopped的进程,使用%1将1号作业恢复到前台运行

    3. backspace无法使用:Ctrl+H或者stty erase ^H

    4. Linux和Windows的文本文件存储格式不同(行尾不同),dos2unix/unix2dos转换

    4. 目录管理

    4.1 系统目录

    • /etc:配置文件
    • /tmp:临时文件
    • /var:系统运行时要改变的数据(比如日志)
    • /bin:系统常用命令(eg:ls、cp、cat)
    • /usr/bin:常用命令(eg:ssh,ftp,make, gcc,git)
    • /sbin, /usr/bin:系统管理员专用命令
    • /dev:设备文件
    • /usr/include:C语言头文件
    • /lib, /usr/lib:C语言链接库文件,静态链接库(.a文件)和动态链接库(.so文件,共享的目标代码,多个.o文件的集成,广泛使用)
      • ldd:用来查看程序运行时所需的共享库

    更详细的blog:LINUX 文件系统都是什么鬼

    4.2 文件通配符

    ​ command后面跟着的是参数或文件通配符,shell进行替换,而正则表达式不进行替换

    1. 元字符
      • *:匹配任意长度的文件名字符串(包括空串),当.作为开头或是包含/时,必须显示匹配
      • ?:匹配任一单字符
      • []:集合,匹配其中任一字符
      • ~:当前用户主目录
      • .:当前目录
      • /:根目录,斜线/,反斜线\

    4.3 常用命令

    1. ls

      • -F:如果是目录,名字后面带/,如果是可执行文件,名字后面带*,如果是链接文件,名字后面带@,普通文件无标记(现在文件都用颜色表示)

      • -l

        第一个字符为文件类型,-普通文件,d目录文件,l符号链接文件,c字符设备文件,b块设备文件,p管道文件

        访问权限(文件所有者、同组用户、其他用户)

        文件链接数

        文件所有者名字和组名

        文件大小(单位为字节,如果是目录则列出目录表大小不是目录大小)

        最后修改日期和时间,文件名

      • -d:列出目录自身的信息

      • ls *:递归一层列出

      • -a:列出所有文件

    2. cp:复制

      • cp file1 file2:将file1复制到file2(如果file2不存在则创建,如果存在则覆盖)
      • cp -r dir1 dir2:如果dir2不存在则复制dir1并改名为dir2,如果dir2存在则将dir1复制到dir2下
      • cp file1 file2 dir:将file1,file2复制到dir目录
      • -u:增量拷贝,便于备份目录
    3. mv:移动

      • mv file1 file2:相当于将file1改名为file2
      • mv file1 file2 dir:要求dir存在
      • mv dir1 dir2:如果dir2不存在则相当于改名,如果dir2存在移动dir1到dir2下
    4. rm

      -r递归删除, -i删除前确认, -f强迫删除只读文件

      --后参数被shell认为是处理对象而不是命令选项

    5. mkdirrmdir

      • -p:自动创建路径中不存在的目录
    6. touch:将文件最后一次修改时间设置为当前时间(如果文件不存在,则创建文件)

    7. find:遍历目录树, find 查找范围 条件 动作

      • 条件

        • -name wildcard:文件名与wildcard匹配,wildcard加单引号,wildcard可以是正则表达式
        • -regex pattern:整个路径名与pattern匹配
        • -type:f普通文件,d目录,l符号链接文件,c(char),b(block),p(pipe)
        • -size +-n :指定文件大小(大于+,默认等于,小于-),单位是c(字符),b(块,512字节),k,M,G,默认b
        • -mtime +-n:文件是最近n天内修改的
        • -newer file:文件修改时间比file还新
        • !:非,前后要有空格, 默认是与
        • \( 条件1 -o 条件2 \):或,因为()是shell的特殊符号
      • 动作

        • -print:打印查找的文件路径名

        • -exec:对查找到的目标执行命令,在-exec之后和分号之前作为一条命令,{}表示文件路径名

          find . -type f -name 'utils.*' -exec ls -lh {} \;
          find . ! -newer file.txt \( -name '*.c' -o -name '*.h' \) -exec grep -n -- --help {} /dev/null \;	# 查找早于file.txt的.c或.h文件,并且在检索到的文件(用{}表示)中查找包含--help的内容,通过grep添加两个文件({}和/dev/null)来显示查找到的内容是在哪一个文件中
          
          • 1
          • 2
        • -ok:类似-exec,在执行命令前需要确认

    8. xargs:批量处理文件,常用于先列出文件然后再xargs批处理

      find . -name '*.c' -print | grep -n --help	# 每找到一个文件都要创建一个进程来grep
      find . -name '*.c' -print | xargs grep -n --help	# 找到所有文件后,只创建一个进程来批处理(grep)这些找到的文件,将标准输入追加到参数列表后面,效率高
      
      • 1
      • 2
    9. tartar c/t/x vzj f my.tar filelist

      1. 必选参数
        • ctar cvf my.tar filelist将filelist中文件打包到my.tar中
        • ttar tvf my.tar查看my.tar中有什么文件
        • xtar xvf my.tar解包,此时不需要压缩算法
        • f:指定设备文件名(即.tar文件)
      2. 可选参数
        • v:verbose
        • z:gzip压缩,快,常gz后缀
        • j:bzip2压缩,压缩率高,常bz2后缀
    10. gzip, gunzip; bzip2, bunzip2:压缩解压缩

    11. dudu -d 1 -h显示文件大小,类似windows

      • -d:递归深度

    5. 文件管理

    5.1 运行时获取信息

    1. 配置文件
    2. 环境变量:env打印当前环境变量,PATH是可执行文件的查找路径,CLASSPATH是类库查找路径,使用export来添加环境变量
    3. 命令行参数
    4. 交互式键盘输入

    5.2 文件系统

    1. 文件系统命令

      • mkfs:创建文件系统

      • mount, umount:安装、卸载文件系统

      • df :查看文件系统空间空间

    2. 文件系统结构

      • 引导块:启动系统

      • 专用块:管理快(或超级块),存放文件系统的管理信息

      • i节点区:每个文件一个i-node,包括索引、指针和文件信息

      • 文件存储区:目录表(文件名和i-node指针)和文件内容

    5.3 链接

    1. 硬链接:目录项指定的“文件名 i-node”映射关系

      ln file.txt lnk	# 创建file.txt的硬链接lnk,删除lnk时对应i-node的link数减一,仅限于同一个文件系统中的普通文件
      
      • 1
    2. 软链接(符号链接):创建一个“符号链接文件”,里面存储路径(如果时相对路径,则相对于该符号链接文件)

      ln -s file.txt lnk # 创建file.txt的软链接lnk
      
      • 1

    5.4 可执行文件

    1. 程序文件:二进制
    2. 脚本文件:第一行指定解释程序,在运行中由解释程序创建一个进程进行解释执行

    5.5 权限

    1. 目录权限:实际上是对目录表的权限,无读权限则无法ls,无写权限则无法创建、删除文件等(但文件可能可以修改),执行权限表示分析路径名中可以检索该目录
    2. chmod [ugoa][+-=][rwxst] file
      • u=user, g=group, o=other, a=all,

    6. Shell

    6.1 shell

    ​ 命令解释器,交互式方式下替换、转义、内部外部命令,非交互式方式下编写脚本程序批量处理

    6.2 bash启动方式

    1. 注册shell,启动时自动执行

      (用户级):~/.bash_profile

      (系统级):/etc/profile

      退出时,自动执行

      (用户级):~/.bash_logout

      (系统级):/etc/bash.bash.logout

    2. 交互式shell,启动时自动执行

      (用户级):~/.bashrc

      (系统级):/etc/bash.bashrc

    3. 脚本解释器:

      • 新创建子进程,在子进程中执行脚本
        • bash < test.sh:无法携带命令行参数
        • bash test.sh ..-x参数便于调试和观察
        • chmod u+x test.sh; ./test.sh ..
      • 在当前shell中执行
        • chmod u+x test.sh; . test.sh ..

    6.3 别名

    在.bashrc中添加一个别名

    alias lls = "ls -lh"
    
    • 1

    6.4 重定向和管道

    1. 输入重定向

      • <:从file中获取输入

      • <<:从shell脚本中获取输入

        cat << WORD
        Now: `date`
        WORD
        # WORD是定界符,之间内容进行替换并执行获取输入
        
        cat << 'WORD'
        Now: `date`
        WORD
        # 当定界符有单引号时,之间内容不做替换
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
      • <<<:从命令行获取信息作为标准输入

        base64 <<< 'test'
        
        • 1
    2. 输出重定向

      • >:覆盖,stdout重定向

      • >>:追加内容到文件,stdout重定向

      • 1>:将句柄1(stdout,标准输出)重定向

      • 2>:将句柄2(stderr)重定向

      • 2>&1:将标准输出(stdout)和标准错误(stderr)保存到同一个文件,放在命令最后

        command > log.txt 2>&1
        # command 将command的stdout和stderr输出到同一个文件log.txt
        command >> log.txt 2>&1
        # command 将command的stdout和stderr内容追加到同一个文件
        
        • 1
        • 2
        • 3
        • 4
        # >和>>可以混用,比如正确的结果追加到right.txt,错误的结果重定向覆盖到wrong.txt
        command 1>>right.txt 2>wrong.txt
        
        • 1
        • 2
      • /dev/null:黑洞文件

      • 管道|将前一命令的stdout作为后一命令的stdin,同样可以使用2>&1

        gcc test.c > test.err 2>&1 | less
        
        • 1
    3. 管道:|

      • 注意管道符连接的多个命令是并行执行的,有时命令会阻塞等待标准输入
        sleep 5 | sleep 5 # shell会同时启动两个进程,执行结果是sleep 5秒
        
        • 1

    6.5 设置

    1. set -u:当引用一个未定义的变量时,产生一个错误
    2. set +u:当引用一个未定义的变量时,视为一个空字符串
    3. set -x:打印出shell替换后的命令和参数,常用于观察命令经过shell替换后哪里错误
    4. set +x:取消set -x

    6.6 常用命令

    1. echo:打印命令行参数

      • -e:转义打印
    2. printf:类似C语言

      printf "home:%s\n" $HOME
      
      • 1
    3. read:获取用户输入

    6.7 环境变量

    子进程继承父进程的环境变量,以后再不影响

    • 使用export将局部变量转为环境变量
    • PATH:命令查找路径,不要将.放入PATH,PATH以:分隔路径
    • env:列出环境变量
    • set:列出环境变量、局部变量、函数定义

    6.8 替换

    1. 文件名生成替换:遵循文件通配符规则

    2. 变量替换:$var

    3. 命令替换:以命令的stdout进行替换, ``````````(反撇号)或者 $()

      now = `date`
      now = $(date)
      
      • 1
      • 2

    6.9 语法

    6.9.1 变量

    • shell先替换,再执行
    • 变量都是字符串,可以修改
    • 赋值语句等号两边不能有空格(否则会认为是参数),右侧字符串如果有特殊字符需要用双引号
    • 引用变量:$var${var},引用未定义变量认为是空字符串
    • 内部变量:位置参数
      • $0, $1, $2:第一个命令行参数(脚本文件本身的名字),第二个命令行参数,第三个命令行参数
      • $#:命令行参数的个数
      • $*:相当于"$1 $2 $3 ..."将整体作为一个参数
      • $@:相当于"$1" "$2" "$3" ... 将变长的命令行参数传递给其他命令
      • shift n :位置参数的移位操作,位置参数顺次向前移动n个位置

    6.9.2 元字符

    • 空格,tab:命令行参数分隔符

    • 回车:运行命令

    • ><|:重定向与管道(还有||

    • ;:一个内多个命令(还有;;

    • &:后台运行(还有&&

    • $:引用变量

    • `````````:反撇号用于命令替换,出现元字符注意转义,可以嵌套但要转义\\\`

      year=`expr \`date '+%Y'\` - 10 `
      
      • 1
    • 文件通配符:*[]?

    • ():用于定义shell函数或在子shell中执行一组命令

    • ":除了$和`````````,其他的特殊字符都不转义,里面只能有四种转义:\"\$\` 、 `\`

    • ':都不转义,中间不能有单引号(可以拆分成多段)

      在*.conf文件中匹配'192.168.x.x'结尾
      pattern:  '192\.168\.[0-9.]*'$
      grep \''192\.168\.[0-9.]*'\''$' *.conf	# 使用单引号
      grep "'192\\.168\\.[0-9.]*'\S" *.conf	# 使用双引号
      grep \'192\\.168\\.\[0-9.]\*\'\$ *.conf	# 只使用转义,不被引号包括的字符串
      
      • 1
      • 2
      • 3
      • 4
      • 5

    6.9.3 条件判断

    1. 逻辑判断

      • 命令的返回码是0,则命令执行成功

      • $?输出上一个命令的返回码,用管道连接时以最后一个命令的返回码为准

      • && ||:与,或,可以短路

        cmd1 && cmd2	# cmd1执行失败就不执行cmd2
        cmd1 || cmd2	# cmd1执行成功就不执行cmd2
        
        • 1
        • 2
    2. 检测命令:test[(是一个命令而非词法符号,最后一个参数必须是])

      • 文件特性检测:

        • -f普通文件,-d目录文件,-r可读,-w可写,-x可执行,-ssize>0

          test -r myfile.txt && echo readable
          [ -r myfile.txt] && echo readable
          
          • 1
          • 2
      • 检测命令是否执行成功

      • 比较

        • 字符串比较:shell中有三种字符串

          str1 = str2str1 != str2等号两边一定要有空格

        • 整数的比较

          -eq=,-ne!=, -gt>, -lt<, -ge>=, -le<=

        • 逻辑运算

          ! 非,-o或, -a

    3. 命令组合:经常命令检测之后执行多条命令

      • {}:在当前shell中执行,命令组合最后有分号

        [ -d $DIR ] && { cd ..; ls -l; ps; } | less
        
        • 1
      • ():在子进程中执行,命令组合最后无分号

        [ -d $DIR ] $$ ( cd..; ls -l; ps ) | less
        
        • 1
    4. 条件结构

      if condition
      	then list
      elif condition
      	then list
      else
      	list
      fi
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

    6.9.4 表达式运算expr

    • 运算类型:(),五种算术运算,六种关系运算,& |与或, :正则
    • 注意运算符的转义
    • :正则:expr str : pattern
      • 从最左字符开始尽量匹配,最终输出匹配的长度
      • 使用的是基本正则语法,但是\+ \? \|表示匹配一个或多个,匹配0个或1个,或(两端任选其一)
      • 使用\( \),将其中匹配的内容提取出来

    6.9.5 循环结构

    1. while

      while condition
      	do list
      done
      
      • 1
      • 2
      • 3
    2. for

      for name in word1, word2, ...
      	do list
      done
      
      # 或者
      for name
      	do list
      done
      # 相当于
      for name in $1, $2, ...
      	do list
      done
      
      for i in `seq 1 255` # 相当于for i in range(1,256)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
    3. break n:跳出n层循环

    4. continue

    5. exit val:结束脚本执行,返回值为val

    6.9.6 其他

    1. eval:将参数先进行变量替换或加工,然后将结果作为程序来执行

    .9.4 表达式运算expr

    • 运算类型:(),五种算术运算,六种关系运算,& |与或, :正则
    • 注意运算符的转义
    • :正则:expr str : pattern
      • 从最左字符开始尽量匹配,最终输出匹配的长度
      • 使用的是基本正则语法,但是\+ \? \|表示匹配一个或多个,匹配0个或1个,或(两端任选其一)
      • 使用\( \),将其中匹配的内容提取出来

    6.9.5 循环结构

    1. while

      while condition
      	do list
      done
      
      • 1
      • 2
      • 3
    2. for

      for name in word1, word2, ...
      	do list
      done
      
      # 或者
      for name
      	do list
      done
      # 相当于
      for name in $1, $2, ...
      	do list
      done
      
      for i in `seq 1 255` # 相当于for i in range(1,256)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
    3. break n:跳出n层循环

    4. continue

    5. exit val:结束脚本执行,返回值为val

    6.9.6 其他

    1. eval:将参数先进行变量替换或加工,然后将结果作为程序来执行

    7. 其他资料

    蒋砚军, 高占春. 实用 UNIX 教程[M]. 清华大学出版社, 2005.
    Linux开发环境及应用
    W3Cshcool;UNIX 入门指南
    recommand: linux checklist from PLCT

  • 相关阅读:
    C和指针 第15章 输入/输出函数 15.13 改变缓冲方式
    Spring MVC中@RequestParam注解的功能是什么呢?
    @MapperScan注解原理解析 --> 1.3版本和2.0版本的区别
    NumPy库的学习
    C#winform中从数据库中读取数据
    【fiddler学习问题记录】——手机端证书下载页打不开、无法将此证书安装(已解决)
    E2类 MCR-WPT系统的搭建
    【广州华锐互动】VR虚拟仿真技术为航测实践教学提供了哪些帮助?
    Flink 程序剖析
    LabVIEW前面板和程序框图的最大尺寸
  • 原文地址:https://blog.csdn.net/weixin_44343319/article/details/126457999