Linux命令行及操作系统基础学习笔记

Posted by Waynerv on

category: 操作系统

Tags: Linux 读书笔记

基本操作

终端重要快捷键

  1. [tab]自动补全,可以补全目录、命令、命令参数,非常实用
  2. [Ctrl+C]强行终止当前程序,但不会退出终端(终端中复制粘贴可以适应Ctrl+Shift+C或鼠标中键)
  3. [Ctrl+D]键盘输入结束或退出终端
  4. 方向键选择历史输入
  5. 查找文件时使用通配符代替一个或多个真正字符(只能在参数值中使用,命令中使用无法识别)
字符 含义
* 匹配 0 或多个字符
? 匹配任意一个字符
[list] 匹配 list 中的任意单一字符
[^list] 匹配 除list 中的任意单一字符以外的字符
[c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]
{string1,string2,...} 匹配 string1 或 string2 (或更多)其一字符串
{c1..c2} 匹配 c1-c2 中全部字符 如{1..10}

6. $ man \ 获取帮助,快速查询某个具体参数:$ ls --help

用户及文件权限管理

用户管理

  1. 查看当前用户:who am i查看当前为终端用户名;whoami查看当前登录用户名
  2. su 可以切换到用户user,执行时需要输入目标用户的密码,sudo 可以以root特权级别运行cmd命令,需要当前用户属于 sudo 组,且需要输入当前用户的密码
  3. 创建用户:$ sudo adduser kaka
  4. 切换登录用户:$ su -l lilei(-是-l的简写,默认为root用户)
  5. 查看用户组:$ groups kaka或者$ cat /etc/group | sort
  6. 将其他用户加入sudo用户组:切换到sudo组中的某个用户,使用$ sudo usermod -G sudo kaka命令
  7. 删除用户:$ sudo deluser kaka --remove-home(同时删除家目录)
  8. su USERNAME,与su - USERNAME的不同之处如下:
    • su - USERNAME切换用户后,同时切换到新用户的工作环境中。
    • su USERNAME切换用户后,不改变原用户的工作目录,及其他环境变量目录。

权限管理

  1. 查看文件权限:ls -l 文件权限
  2. 一个目录同时具有读权限和执行权限才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件(目录也是一个文件)
  3. 变更文件所有者:$ sudo chown kaka iphone6,将iphone文件所有者变更为kaka
  4. 修改文件权限:chmod
    • 二进制数字表示:rwx分别对应3位二进制数字,每种权限状态都对应一位上的0或1(和为0-7)。示例:$ chmod 600 iphone6
    • 加减赋值操作:$ chmod go-rw iphone6,g、o、u分别表示group、others 和user,+和-分别表示增、减权限。

目录结构及文件操作

目录结构

  1. 目录和存储介质:Linux是以目录为主的,先规定好了目录结构,再向目录挂载磁盘。
  2. FHS标准目录结构:FHS标准
  3. 相对路径和绝对路径,相对路径使用. 表示当前目录,.. 表示上一级目录
  4. cd ~ 切换至当前用户的home目录

文件操作

新建

  1. 新建空白文件:touch newfile
  2. 新建目录:mkdir newdir,无法直接创建多级目录,需要添加-p参数,-m配置权限

复制

  1. 复制文件:$ cp test father/son/grandson 将test复制到后面的目录中
  2. 复制目录:$ cp -r father family增加-r递归参数

删除

  1. 删除文件:$ rm test,-f忽略提示强制删除
  2. 删除目录:$ rm -r test,增加-r递归参数

移动和重命名

  1. 移动文件:mv 源目录文件 目的目录
  2. 重命名文件:$ mv file1 myfile
  3. 批量重命名:rename 's/.txt/.c/' *.txt

查看文件

  1. cat,tac正序和倒序打印文件内容到标准输出(终端),-n显示行号,也可以用nl命令

查看文件类型

  1. Linux 中文件的类型不是根据文件后缀来判断的
  2. 查看命令:$ file /bin/ls

编辑文件

  1. 命令:$ 编辑器 被编辑文件

环境变量和文件查找

环境变量

变量

  1. Shell变量:在计算机中记录某个值(字符串或者数值)的标识符,无需指定类型名
  2. 操作变量:

    $ declare tmp # 创建变量
    $ tmp=kaka # 赋值变量(也可通过赋值来声明)
    $ echo $tmp # 读取变量的值($符号表示引用一个变量的值)
    

    环境变量

  3. Shell 中运行的大部分命令都将以 Shell 的子进程的方式运行,因此会继承Shell的环境变量

  4. 三种变量类型
    • 用户自定义变量,只在当前shell进程中有效
    • Shell内建环境变量
    • 从自定义变量导出的环境变量
  5. 三个打印环境变量信息的命令:
    • set显示当前shell所有变量,包括内建环境变量、用户自定义变量及导出的环境变量
    • env显示与当前用户相关的环境变量
    • export显示从shell中导出成环境变量的变量,也用来将自定义变量导出成环境变量,实例:$ export FLASK_APP=hello.py
  6. 在当前进程的子进程有效的变量则为环境变量,通常设为大写
  7. 变量的生效时间:使用 export 命令行声明的环境变量在关闭 shell 时即失效
  8. 永久生效:需要修改配置文件
    • /etc/profile存放对所有用户生效的环境变量
    • /etc/bashrc存放bash的shell变量
    • /home/kaka/.profile存放只对当前用户永久生效的环境变量

命令的查找路径和顺序

  1. Shell通过环境变量PATH来搜索可执行文件路径
  2. 在shell中执行命令的实际过程:在PATH变量中提供的路径下搜索同名可执行文件并执行
  3. 添加自定义路径:$ PATH=$PATH:/home/kaka/mybin(扩增变量内容)
  4. 持久化:将修改变量命令写入用户目录下的shell配置文件如/home/kaka/.bashrc

修改和删除已有变量

  1. 修改变量
变量设置方式 说明
${变量名#匹配字串} 从头向后开始匹配,删除符合匹配字串的最短数据
${变量名##匹配字串} 从头向后开始匹配,删除符合匹配字串的最长数据
${变量名%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最短数据
${变量名%%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最长数据
${变量名/旧的字串/新的字串} 将符合旧字串的第一个字串替换为新的字串
${变量名//旧的字串/新的字串} 将符合旧字串的全部字串替换为新的字串

2. 删除变量:$ unset temp

让环境变量立即生效

  1. 通过修改配置文件设置环境变量后需要重启终端或者主机才能生效,也可以使用source命令使其立即生效

    搜索文件

  2. whereis从数据库中搜索bin、man等少数路径,通常用于搜索二进制文件和man帮助文件及源代码文件

  3. locate从数据库中查找所有路径,使用updatedb手动更新数据库(首次安装使用locate需要更新)
  4. which从PATH环境变量指定的路径中搜索命令
  5. find从硬盘中查找,功能强大但速度慢。命令格式:find [path] [option] [action] .实例:$ sudo find /etc/ -name interfaces

文件打包和解压缩

概念

  1. .tar后缀代表未压缩的tar打包文件。已压缩的tar文件则附加压缩文件的扩展名,如经过gzip压缩后的tar文件,扩展名为.tar.gz

zip压缩打包程序

  1. 打包文件夹,-r 参数表示递归打包包含子目录的全部内容,-q 参数表示为安静模式,即不向屏幕输出信息,-o 表示输出文件,需在其后紧跟打包输出文件名
$ cd /home/shiyanlou
$ zip -r -q -o shiyanlou.zip /home/shiyanlou/Desktop
$ du -h shiyanlou.zip
$ file shiyanlou.zip
  1. 设置压缩级别后重新打包,设置参数-[1-9]
$ zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou/Desktop 
$ zip -r -1 -q -o shiyanlou_1.zip /home/shiyanlou/Desktop 
  1. 创建加密压缩包:
$ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou/Desktop
  1. 跨平台兼容处理,加上 -l 参数将Linux下的换行符LF转换为Windows下的CR+LF:
$ zip -r -l -o shiyanlou.zip /home/shiyanlou/Desktop

使用unzip解压缩zip文件

  1. 解压到当前目录:
$ unzip shiyanlou.zip
  1. 安静解压到指定目录:
$ unzip -q shiyanlou.zip -d ziptest # 目录不存在会自动创建
  1. 不解压只查看内容:
$ unzip -l shiyanlou.zip
  1. 解压时使用-O(英文字母大写o)参数指定编码类型:
unzip -O GBK 中文压缩文件.zip

tar打包工具

  1. tar选项与参数:
    • -c 创建打包文件,-t 查看打包文件包含的文件名,-x 解打包或解压缩,不能同时出现
    • -f 后接tar文件名,-v 将解压缩过程可视化,-p 保留备份数据的原本权限和属性,-C 指定解压缩目录, -P 保留绝对路径
    • -z使用gzip支持,-j使用bzip2支持,-J使用xz支持,不能同时出现
  2. 打包
$ tar -c -f filename.tar [要被打包的文件或目录名称]
  1. 压缩:
tar -[z|j|J]cv -f filename.tar.bz2 [要被压缩的文件或目录名称]
  1. 查询:
tar -[z|j|J]tv -f filename.tar.bz2
  1. 解压缩:
tar -[z|j|J]xv -f filename.tar.bz2 -C [欲解压缩的目录]
  1. 压缩过程中会自动去掉被压缩路径中表示绝对路径的/,因为绝对路径解压后会直接将该路径文件覆盖

总结常用命令

  1. zip:
打包 :zip something.zip something (目录请加 -r 递归参数)
解包:unzip something.zip
指定路径:-d 参数
  1. tar:
打包:tar -cf something.tar something
解包:tar -xf something.tar
指定路径:-C 参数

文件系统操作与磁盘管理

背景知识

  • 在Linux系统中,每个设备都被当成一个文件来对待,每个设备都会有设备文件名。
  • 磁盘设备文件名通常分为两种,实际SATA/USB设备文件名为/dev/sd[a-p],而虚拟机的设备可能为/dev/vd[a-p]
  • 磁盘的第一个扇区主要记录了两个重要的信息,分别是:(1)主要开机记录区(Master Boot Record, MBR) :可以安装开机管理程序的地方,有446 Bytes (2) 分区表 (partition table) :记录整颗硬盘分区的状态,有64 Bytes;
  • 磁盘的 MBR 分区方式中,主要与延伸分区最多可以有四个,逻辑分区的设备文件名号码,一定由5号开始;
  • 如果磁盘容量大于 2TB 以上时,系统会自动使用GPT分区方式来处理磁盘分区。
  • GPT 分区已经没有延伸与逻辑分区的概念,你可以想像成所有的分区都是主分区!
  • 某些操作系统要使用 GPT 分区时,必须要搭配 UEFI 的新型 BIOS 格式才可安装使用。
  • 开机的流程由:BIOS-->MBR-->-->boot loader-->核心文件;
  • boot loader的功能主要有:提供菜单、载入核心、转交控制权给其他loader
  • boot loader可以安装的地点有两个,分别是 MBR 与 boot sector
  • Linux操作系统的文件使用目录树系统,与磁盘的对应需要有“挂载”的动作才行;
  • 新手的简单分区,建议只要有/及swap两个分区即可

df操作

  1. disk free:查看文件系统磁盘空间占用,包括文件系统,使用量及挂载点(个别挂载点代表内存)
  2. df -h /bin查看指定目录的文件系统情况
  3. -T显示文件系统格式,-i容量以inode形式展示

du操作

  1. disk usage:查看当前目录或指定文件的空间占用情况
  2. 常用参数:
du -h #同--human-readable 以K,M,G为单位,提高信息的可读性。
du -a #同--all 显示目录中所有文件的大小。
du -s #同--summarize 仅显示总计,只列出最后加总的值。
du -d 1 #定义查看目录深度
du -S #仅显示各目录中文件大小,不包括子目录也不加总

创建虚拟磁盘

创建虚拟镜像文件

  1. dd命令:读取磁盘装置的内容(包括没有用到的扇区),输出到指定文件
  2. $ dd if="input_file" of="output_file" bs="block_size" count="number"选项与参数:
    • if :input file也可以是磁盘
    • of :output file也可以是磁盘
    • bs :规划的一个 block 的大小,若未指定则预设是 512 bytes(一个 sector 的大小)
    • count:多少个 bs 的意思。
  3. dd命令可以在拷贝的同时对数据进行转换,如:conv=ucase
  4. mkfs命令:make filsystem格式化磁盘,按下tab显示可用文件系统格式
$ sudo mkfs.ext4 virtual.img  #将虚拟磁盘镜像格式化为ext4系统

文件挂载

  1. mount命令:挂载磁盘到目录树,一般格式:mount [options] [source] [directory],示例:$ mount -o loop -t ext4 virtual.img /mnt文件类型可以自动识别
  2. 常用命令mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]
  3. -o loop参数将提供一个接口允许文件视为设备,如果文件中包含一个完整的文件系统,那么文件就可以如同磁盘设备一般被挂载
  4. umount 命令卸载已挂载设备名或者挂载点:$ sudo umount /mnt
  5. 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
  6. 单一目录不应该重复挂载多个文件系统;
  7. 要作为挂载点的目录,理论上应该都是空目录才是。

磁盘分区

  1. 查看磁盘分区表信息:$ sudo fdisk -l
  2. 进入磁盘分区模式:$ sudo fdisk virtual.img(也可使用gdisk)
  3. 按程序指示操作即可,主要设置结束扇区时直接 +容量 即可
  4. 设置完毕后,$ partprobe -s命令更新扇区

建立镜像与回环设备的关联

  1. 建立关联:sudo losetup /dev/loop0 virtual.img
  2. 解除关联:$ sudo losetup -d /dev/loop0
  3. 为各分区建立虚拟设备的映射:
$ sudo apt-get install kpartx
$ sudo kpartx -av /dev/loop0
  1. 格式化各分区:
$ sudo mkfs.ext4 -q /dev/mapper/loop0p1
$ sudo mkfs.ext4 -q /dev/mapper/loop0p5
$ sudo mkfs.ext4 -q /dev/mapper/loop0p6
  1. 新建空目录挂载虚拟磁盘::
$ mkdir -p /media/virtualdisk_{1..3}
# 挂载磁盘分区
$ sudo mount /dev/mapper/loop0p1 /media/virtualdisk_1
$ sudo mount /dev/mapper/loop0p5 /media/virtualdisk_2
$ sudo mount /dev/mapper/loop0p6 /media/virtualdisk_3

作业

  1. 在当前目录下找出占用空间最大的前10大文件:du -ah | sort -nr | head -n 10

Linux下的帮助命令

  1. 在终端中使用type命令区分内建命令与外部命令
  2. help 命令用于显示 shell 内建命令的简要帮助信息,外部命令尝试使用--help参数
  3. man 命令可以得到程序的更多相关信息和 Linux 的更多特性,不区分内外部命令
  4. info命令显示更多帮助信息

Linux任务计划crontab

  1. 启动cron服务(默认为启动状态):sudo cron -f &
  2. 创建用户计划任务:crontab -e编辑计划任务(添加或删除),会在 /var/spool/cron/crontabs 中添加一个该用户的任务文档,不同用户间隔离
  3. 添加计划任务格式:*/1 * * * * touch /home/shiyanlou/$(date +\%Y\%m\%d\%H\%M\%S)每分钟创建空白文件
  4. 添加条目后输入:wq保存退出
  5. 查阅计划任务:crontab -l,清空计划任务:crontab -r(删除单条使用crontab -e指令)
  6. 确认任务是否成功在后台启动:
ps aux | grep cron
sudo tail -f /var/log/syslog # 查看执行命令后在日志中的反馈信息
  1. 创建系统级别计划任务:以root权限编辑/etc/crontab文件,如:sudo vim /etc/crontab
  2. cron 服务监测时间最小单位是分钟,所以cron服务会每分钟去读取一次 /etc/crontab 与 /var/spool/cron/crontabs 里面的內容

命令执行顺序控制与管道

数据流重定向

  1. > :以覆盖的方法将『标准输出』输出到指定的文件或装置上;
  2. >>:以累加的方法将『标准输出』输出到指定的文件或装置上;
  3. 2> :以覆盖的方法将『标准错误输出』输出到指定的文件或装置上;
  4. 2>>:以累加的方法将『标准错误输出』输出到指定的文件或装置上;
  5. /dev/null 将不需要的数据输出到垃圾桶黑洞装置
$ find /home -name .bashrc > list 2> /dev/null
  1. 同时将标准输出和标准错误输出写入同一文件的特殊写法:
$ find /home -name .bashrc > list 2>&1 
  1. standard input : < 与 << 将原本需要由键盘输入的数据,改由文件内容来取代
$ cat > catfile < ~/.bashrc
$ cat > catfile << "eof"

命令执行的判断依据

  1. cmd ; cmd 不考虑指令相关性的连续指令下达
  2. 若前一个指令执行的结果为正确,在 Linux 底下会回传一个 $? = 0 的值
  3. cmd1 && cmd2:若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2,否则不执行
  4. cmd1 || cmd2:若 cmd1 执行完毕且为错误($?!=0),则开始执行 cmd2,否则不执行
  5. 复杂条件格式:command1 && command2 || command3命令1正确执行则继续执行命令2,错误执行则继续执行命令3

管道命令

  1. 管线命令仅会处理 standard output,对于 standard error output 会予以忽略
  2. 管线命令必须要能够接受来自前一个指令的数据成为 standard input 继续处理才行
  3. cut命令:打印每一行的某一字段
$ cut /etc/passwd -d ':' -f 1,6  # 打印以:为分隔符的第1个和第6个字段(会显示分隔符)
  1. cut命令参数
    • -d :后面接分隔字符。与-f一起使用
    • -f :依据-d的分隔字符将一段讯息分区成为数段,用-f取出第几段的意思
    • -c :以字符 (characters) 的单位取出固定字符区间
  2. grep命令:在文本或标准输出中查找匹配字符串(可做文件内的字符串查找)
$ grep [-acinv] [--color=auto] '搜寻字符串' filename...
  1. grep命令参数:-r参数表示递归搜索子目录中的文件,-n表示打印匹配项行号,-I表示忽略二进制,-v表示反向选择文件。示例:
export | grep ".*yanlou$"  # 匹配字符串中可使用正则表达式
  1. wc命令:统计并输出一个文件中行、单词和字节的数目
$ wc /etc/passwd  # 输出行、单词、字节数
$ ls -dl /etc/*/ | wc -l  # 统计 /etc 下面所有目录数
  1. wc命令参数:-l行数,-w单词数,-c字节数,-m字符数,-L最长行字节数
  2. sort排序命令,默认为字典排序:
$ cat /etc/passwd | sort
  1. sort命令参数:-r反转排序,-n按数字排序;按特定字段排序:-t参数用于指定字段的分隔符;-k字段号用于指定排序字段
$ cat /etc/passwd | sort -t':' -k 3 -n
  1. uniq命令:用于过滤或者输出重复行,注意只能去连续重复的行,不是全文去重,要达到预期效果要和排序配合使用
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq
  1. uniq命令参数:-c对重复次数进行计数,-d仅输出重复的行去重结果,-D输出重复的行(但不去重)

简单的文本处理

  1. tr命令:删除一段文本信息中的某些文字或将其进行转换
$ echo 'hello shiyanlou' | tr -d 'olh'  # 删除所有的'o','l','h'
  1. 大小写转换:echo 'input some text here' | tr '[:lower:]' '[:upper:]' 小写转换成大写
  2. 删除字符:-d:删除讯息当中的SET1包含的字符;-s:删除连续重复的字符
  3. col命令:将Tab换成对等数量的空格键。
  4. col参数:-x将Tab转换为空格,-x将Tab转换为空格。 ^I 是Tab转义成可见字符的符号
  5. join命令:将两个文件中包含相同内容的那一行合并在一起join [-ti12] file1 file2默认对比第一个字段
  6. 将/etc/passwd与/etc/group两个文件合并,指定以':'作为分隔符, 分别比对每行第4和第3个字段
$ sudo join -t':' -1 4 /etc/passwd -2 3 /etc/group  # -t指定分隔符,默认为空格
  1. paste命令:不对比数据,简单地将多个文件合并一起,以Tab隔开
  2. paste命令参数:-d指定合并的分隔符,默认为Tab;-s不合并到一行,每个文件单独为一行
  3. Windows 的断行符为 CR+LF(\r\n),Linux/UNIX 为LF(\n)。使用cat -A 文本 可以看到文本中包含的不可见特殊字符。Linux 的\n表现出来就是一个$,而 Windows/dos的表现为^M$,可以直接使用dos2unix和unix2dos工具在两种格式之间进行转换,使用file命令可以查看文件的具体类型。

数据流重定向

  1. 重定向标准输出到文件:$ echo 'hello shiyanlou' > redirect
  2. 标准错误重定向:
# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ cat Documents/test.c hello.c >somefile  2>&1
  1. 使用tee命令同时将数据流重定向到文件去与屏幕:$ echo 'hello shiyanlou' | tee hello
  2. 永久重定向:使用exec替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的标准输出都将被重定向到文件中,直到退出当前子shell,或取消exec的重定向
  1. 使用exec命令可以创建新的文件描述符:
$ exec 3>somefile
$ echo "this is test" >&3
$ cat somefile
  1. 利用/dev/null完全屏蔽命令的输出(所有导入它的数据都将被“吞噬”)
$ cat Documents/test.c nefile 1>/dev/null 2>&1
  1. 使用xargs分割参数列表,读入标准输出,并作为后续命令的参数:
$ find /usr/sbin -perm /7000 | xargs ls -l

等价于

$ ls -l $(find /usr/sbin -perm /7000)

正则表达式

基本语法

字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。
^ 匹配输入字符串的开始位置。
$ 匹配输入字符串的结束位置。
{n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
* 匹配前面的子表达式零次或多次。例如,zo能匹配“z”、“zo”以及“zoo”。等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。
? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。
. 匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“(.|\n)”的模式。
(pattern) 匹配pattern并获取这一匹配的子字符串。该子字符串用于向后引用。要匹配圆括号字符,请使用“\(”或“\)”。
x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。
[xyz] 字符集合(character class)。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。其中特殊字符仅有反斜线\保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符^如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符 - 如果出现在字符串中间表示字符范围描述;如果如果出现在首位则仅作为普通字符。
[^xyz] 排除型(negate)字符集合。匹配未列出的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
[^a-z] 排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
运算符(优先级) 说明
\ 转义符
(), (?:), (?=), [] 括号和中括号
*、+、?、{n}、{n,}、{n,m} 限定符
^、$、\任何元字符 定位点和序列
选择

思维导图:regex

grep模式匹配命令

  1. 位置:$ grep '^shiyanlou' /etc/group
  2. 数量:$ echo 'zero\nzo\nzoo' | grep 'zo*'
  3. 选择:$ echo '1234\nabcd' | grep '[[:alpha:]]'
  4. 使用拓展正则表达式需要加上-E参数或使用egrep
  5. Linux的grep默认仅支持基础正则表达式,验证邮箱用的表达式里面的+,()属于扩展的正则表达式。所以要用egrep或者是grep –E

sed:用于过滤和转换文本的流编辑器

  1. 命令基本格式:
sed [参数]... [执行命令] [输入文件]...
$ sed -i 's/sad/happy/g' test # 表示将test文件中的"sad"替换为"happy" g表示全局范围
$ /sbin/ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g' # 可用于管道命令对标准输出进行处理
  1. 常用参数:-n只打印受影响的行,-r使用拓展正则表达式,-i直接修改文件内容不输出
  2. 常用执行命令:s行内替换,c整行替换,a插入到指定行的后面,i插入到指定行的前面,p打印指定行,d删除指定行

awk文本处理语言

  1. 定义:一种用于处理文本的编程语言工具
  2. 命令格式:$ pattern {action},没有pattern默认匹配输入的全部文本,没有action默认打印匹配内容到屏幕
  3. 可以处理后续接的文件,也可以读取来自前个指令的 standard output
  4. 以行为一次处理的单位,以字段为最小的处理单位,$1指代第一个字段。
  5. print打印的非变量内容都需要用""一对引号包围起来
  6. 示例:$ last -n 5| awk '{print $1 "\t lines: " NR "\t columns: " NF}', $ cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'

Linux下软件安装

在线安装apt-get

  1. 使用apt-get需要首先添加安装源,apt工具首先在本地的安装源中查找服务器信息后才会继续下载
  2. 更新本地软件包列表:sudo apt-get update
  3. 安装软件包:apt-get install <软件包名>,重新安装:sudo apt-get --reinstall install <软件包名>
  4. 软件升级:
# 更新软件源
$ sudo apt-get update
# 升级没有依赖问题的软件包
$ sudo apt-get upgrade
# 升级并解决依赖关系
$ sudo apt-get dist-upgrade
  1. 卸载软件:sudo apt-get remove <软件包名>卸载软件但保留配置,sudo apt-get purge <软件包名>,sudo apt-get autoremove移除不在需要的依赖软件包
  2. 清理软件包:sudo apt-get clean移除下载到本地已安装的软件包,sudo apt-get autoclean移除已安装软件的旧版本软件包
  3. 软件搜索:sudo apt-cache search softname1 softname2...在安装源中搜索软件信息

使用dpkg从本地磁盘安装软件包

  1. deb形式打包的软件包,可以使用安装dpkg命令安装。常用参数:-i安装指定deb包,-L显示已安装软件包的目录信息,-I显示deb包文件信息,-r移除某个已安装的软件包
  2. 使用dpkg安装:$ sudo dpkg -i emacs24_24.5+16ubuntu1.1_amd64.deb
  3. 修复本地安装导致的依赖关系不完整:
$ sudo apt-get update
$ sudo apt-get -f install

从二进制包安装

  1. 将从网络上下载的二进制包解压后放到合适的目录,然后将包含可执行的主程序文件的目录添加进PATH环境变量

Linux进程概念

背景知识

  1. 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;
  2. 进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个标识符(PID),可以说,进程就是一个正在运作中的程序
  3. 程序彼此之间是有相关性的,故有父进程与子进程之分。而 Linux 系统所有进程的父进程就是 init 这个PID 为 1 号的进程。
  4. 在 Linux 的进程呼叫通常称为 fork-and-exec 的流程!进程都会藉由父进程以复制 (fork)的方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。
  5. 常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻程序就会 被我们称为:服务 (daemon)。
  6. 在工作管理 (job control) 中,可以出现提示字符让你操作的环境就称为前景 (foreground),至于其他工作就 可以让你放入背景 (background) 去暂停或运作。
  7. 与 job control 有关的按键与关键词有: &, [ctrl]-z, jobs, fg, bg, kill %n 等;
  8. 进程管理的观察指令有: ps, top, pstree 等等;
  9. 进程之间是可以互相控制的,传递的讯息 (signal) 主要透过 kill 这个指令在处理;
  10. 进程是有优先级的,该项目为 Priority,但 PRI 是核心动态调整的,用户只能使用 nice 值去微调 PRI
  11. nice 的给予可以有: nice, renice, top 等指令

进程的特性

  1. 动态性:进程的实质是一次程序执行的过程,有创建、撤销等状态的变化。而程序是一个静态的实体。
  2. 并发性:进程可以做到在一个时间段内,有多个程序在运行中。程序只是静态的实体,所以不存在并发性。
  3. 独立性:进程可以独立分配资源,独立接受调度,独立地运行。
  4. 异步性:进程以不可预知的速度向前推进。
  5. 结构性:进程拥有代码段、数据段、PCB(进程控制块,进程存在的唯一标志)。也正是因为有结构性,进程才可以做到独立地运行。

进程的分类

  1. 以进程的功能与服务对象区分:用户进程、系统进程
  2. 以应用程序的服务类型区分:交互进程、批处理进程、守护进程

进程的衍生

  1. 子进程就是父进程通过系统调用 fork() 而产生的复制品,fork() 就是把父进程的 PCB 等进程的数据结构信息直接复制过来,只是修改了 PID,所以一模一样,只有在执行 exec() 之后才会不同
  2. 子进程的退出与资源回收:结束执行并回收系统资源,但进程控制块仍驻留在内存中的进程称为僵尸进程
  3. 父进程非正常的结),未能及时收回子进程,子进程仍在运行,这样的子进程称之为孤儿进程
  4. 进程 0 是系统引导时创建的一个特殊进程,它调用 fork() 创建出一个子进程运行/sbin/init 可执行文件,而该进程就是PID=1的进程1,进程1(init进程)是第一个用户态的进程,再由它不断调用 fork()来创建系统里其他的进程,所以它是所有进程的父进程或者祖先进程。

进程组与sessions

  1. 每一个进程都会是一个进程组的成员,一般情况进程组的PGID等同于进程组的第一个成员的 PID
  2. Session 意义在于将多个 jobs 囊括在一个终端,并取其中的一个 job 作为前台,来直接接收该终端的输入输出以及终端信号。 其他 jobs 在后台运行。

工作管理

  1. 通过&符号,可以让命令在后台中运行(但仍然会有标准输出到屏幕)
  2. 通过ctrl + z使我们的当前工作停止并丢到后台中去
  3. 将后台工作切换到前台:fg [%jobnumber]后面不加参数提取预设工作,加参数提取指定工作的编号
  4. 让工作在背景下的状态变成运作中:bg [%jobnumber]加参则指定,不加参则取预设
  5. 管理背景当中的工作:kill -signal %jobnumber,常用signal:1重新读取参数运行,9强制终止,15正常方式终止
  6. 若是在使用kill+信号值然后直接加 pid,你将会对 pid 对应的进程进行操作

Linux进程管理

进程的查看

  1. top实时查看进程状态,注意load average是指运行队列的平均长度,需要除以主机的核数,并非指CPU占用率
  2. ps静态查看当前进程信息,常用:ps -l查看当前登录终端进程,ps -aux查看所有进程,ps axjf查看时树状显示
  3. pstree查看当前活跃进程的树形结构,常用命令:pstree -Aup

进程的管理

  1. 使用kill命令发送SIGUP信号控制进程:查找进程PID,然后执行kill -9 pid
  2. nice 值可以调整的范围是-20 ~ 19,其中 root既可以调整自己的进程也可以调整其他用户的程序,并且所有值可用,普通用户只可以调制属于自己的进程,并且其使用的范围只能是 0 ~ 19,
  3. 使用nice命令创建程序big放入后台:nice -n -5 vim &
  4. 使用renice 来修改已经存在的进程的优先级:renice -5 pid

Linux日志系统

常见的日志

  1. Linux 中大部分的发行版都内置使用syslog系统日志,那么通过前期的课程我们了解到常见的日志一般存放在/var/log
  2. 查看日志信息:less auth.log
  3. 常见日志内容:
日志名称 记录信息
alternatives.log 系统的一些更新替代信息记录
apport.log 应用程序崩溃信息记录
apt/history.log 使用 apt-get 安装卸载软件的信息记录
apt/term.log 使用 apt-get 时的具体操作,如 package 的下载、打开等
auth.log 登录认证的信息记录
boot.log 系统启动时的程序服务的日志信息
btmp 错误的信息记录
Consolekit/history 控制台的信息记录
dist-upgrade dist-upgrade 这种更新方式的信息记录
dmesg 启动时,显示屏幕上内核缓冲信息,与硬件有关的信息
dpkg.log dpkg 命令管理包的日志。
faillog 用户登录失败详细信息记录
fontconfig.log 与字体配置有关的信息记录
kern.log 内核产生的信息记录,在自己修改内核时有很大帮助
lastlog 用户的最近信息记录
wtmp 登录信息的记录。wtmp可以找出谁正在进入系统,谁使用命令显示这个文件或信息等
syslog 系统信息记录

日志的配置

  1. 日志的产生:一种是由软件开发商自己来自定义日志格式然后指定输出日志位置;一种是 Linux 提供的日志服务程序,通常通过rsyslog服务来提供日志管理服务

日志的转储

  1. logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件。我们可以根据日志文件的大小,也可以根据其天数来切割日志、管理日志,这个过程又叫做“转储”。
  2. 大多数 Linux 发行版使用 logrotate 或 newsyslog 对日志进行管理。logrotate 程序不但可以压缩日志文件,减少存储空间,还可以将日志发送到指定 E-mail,方便管理员及时查看日志。
  3. logrotate 是基于 CRON 来运行的,其脚本是 /etc/cron.daily/logrotate;同时我们可以在 /etc/logrotate 中找到其配置文件

注:转载本文,请与作者联系




如果觉得文章对您有价值,请作者喝杯咖啡吧

|
donate qrcode

欢迎通过微信与我联系

wechat qrcode

0 Comments latest

No comments.