Linux系统命令及Shell实战

发布于 2020-02-03  9 次阅读


Linux系统命令及Shell实战

1.1.1 系统引导概述

  1. 加载BIOS(0柱面,0磁道,读取MBR主引导记录)
  2. 加载GRUB,执行/sbin/init,这个程序根据/etc/inittab来初始化,
  3. 根据文件的值,设定运行的runlevel级别,,默认的runlevel定义在“id:3:initdefault:”
  4. 执行/etc/rc.sysinit脚本,初始化系统变量,网络配置,虚拟内存,proc,加载用户定义模块,加载内核设置
  5. 根据第三步读取的值来执行/etc/rc3.d/下的脚本,如果是5,就执行rc5.d脚本
  6. 运行/etc/rc.local
  7. 执行终端或者x-window等待用户登录

1.1.2 系统运行级别

  • runlevel级别有7个,0:关机,1:单用户模式,2:多用户模式(无网络),3:完全多用户(服务器),4:保留,5:窗口模式,支持多用户,网络,6:重启。
  • /etc/rcX.d的脚本中,K代表Kill,S代表Start,先启动K打头的,在启动S打头的,按照数字大小运行(小的先运行)
  • 系统磁盘为sata命名规则则为sda,sdb以此类推,分区后的命名规则,第一个sda1,第二个sda2以此类推。
  • hd0代表第一块磁盘,(hd0,0)代表第一块磁盘的第一块分区
  • initrd文件,英文boot loader initialized RAM disk,boot loader用于初始化的内存磁盘,kernel通过读取initrd文件来获得各种可执行文件和设备驱动,来启动真实文件系统。

1.1.3 查看命令使用命令

  • man文件的种类:常见命令说明,可调用的系统,函数库,设备文件,文件格式,游戏说明,杂项,管理员可用命令,与内核相关说明(man -f 命令,可以查看在哪些man中)
  • info 基于菜单的超文本文档

1.1.4Linux用户和用户组

  • linux有三种用户,普通用户,跟用户,系统用户

    1. 普通用户:普通用户权限很小,ID从500开始编号
    2. 系统用户:系统用户是软件运行需要的用户,比如apache和mysql用户,ID范围一般1-499
    3. 跟用户:跟用户就是root用户,ID是0,对系统有完全控制权限,很危险
  • 在linux中每一个用户至少属于一个组,

  • pty是虚拟终端,远程终端,tty真实终端

  • /etc/passwd文件内容

    1. 用户名
    2. 密码(/etc/shadow中保存)
    3. UID
    4. GID
    5. 说明
    6. 根目录
    7. 登录shell
  • 查看用户命令:users,who,w

  • sudo是用其他用户的权限去执行命令(visudo可以检查sudo的语法格式)

1.1.5 例行任务管理

  • 单一时刻执行任务:at
  • 周期性执行任务:crontab (分钟0-59 小时0-23 日期1-31 月份1-12 星期0-6) 参数:e是修改 l是查看 r是删除

1.1.6 文件和目录管理

  • linux 根据FHS(文件系统层次标准),定义了根目录下的主要目录和每个目录应该放什么

  • head(默认前十行) 查看文件 -n 可以显示指定行数,tail用法相同,只不过是后十行

  • 文件目录的权限:

    • 第一列是文类别和权限,
    • 第二列是连接数,文件的是1,目录是当前目录下的目录的数字+2
    • 第三列是文件的所有人
    • 第四列是文件组
    • 第五列是文件大小
    • 第六列是创建时间或者最近修改时间
    • 第七列是文件名
  • 文件隐藏属性,使用lsattr来查看,设置隐藏属性使用chattr

    • a:只能追加,不能删除
    • i:不能写入,更改,删除
  • Chmod命令,改变文件或目录权限,r=4,w=2,x=1

  • chown 更改用户和用户组, chown wangjie:root a.txt 就是更改文件用户为wangjie组为root,单独更改组为:root

  • chgrp:改变用户所属组 ,感觉跟chown差不多

  • umask遮罩,定义目录文件都是被遮罩过的结果,在/etc/profile文件中设置了遮罩(51-55),(遮罩就是自相残杀,权限相同,两两抵消)

  • file查看文件类型

  • 查找命令

    • find 一般查找 常用蚕食

    • locate(数据库检索,linux每天会检索一下文件存入数据库,手动更新用updatedb)

    • which/whereis 查找执行文件的绝对路径,whereis可以连带查找出man文件

  • 压缩命令

    • gzip/gunzip,压缩和解压,默认不用什么参数
    • tar(tar可以整合压缩,所以后缀为.tgz)
    • 命令参数含义 -z是gzip,-c是创建压缩文件,-x是解压文件,-v是显示当前压缩文件,-f是使用文件名
    • bzip2是用-z压缩,-d解压缩,后缀为.bz2
    • cpio是结合find用来备份文件

1.1.7Linux文件系统

最早的文件系统是minix,存在局限,比如文件名仅支持14字符,最大64MB大小,所以引入ext2

ext2文件系统对于每一个文件或者目录,都有对应的inode对应。缺陷不支持日志,容易丢失数据

ext3文件系统支持了日志功能(方便对文件系统修复)

MBR大小为521字节,分区表占64字节,分区信息使用16字节,所以一块磁盘只能支持四个主分区,为了支持更多分区,使用扩展分区。

  • fdisk 创建文件系统
  • mkfs.ext3格式化分区
  • mount磁盘挂载
  • /etc/fstab自动挂载,参数依次为 挂载文件 挂载到目录 文件系统,使用默认挂载参数,是否用dump备份,启动时是否fsck(1保留给根分区,2其他分区使用,0不检查)
  • fsck和badblocks修复逻辑错误,检查磁盘时候,是未挂载状态

1.1.8Linux逻辑卷 针对前期分配内存不够

https://blog.csdn.net/dyushuo6230/article/details/50441428

使用逻辑卷组管理创建出来的设备

  • 物理卷PV,物理磁盘分区
  • 卷组,PV的集合
  • 逻辑卷:PV中划分出来的逻辑磁盘

1.1.9硬链接和软连接

硬链接:通过索引节点进行连接,允许一个文件有多个有效路径名,删除一个并不影响其他,除非删除最后一个节点。不允许给目录创建硬链接,必须再同一个分区才能创建硬链接。(有一个数字会变化,代表硬连接数)

软连接:可以指向任意文件或者目录,可以跨文件系统,创建软连接使用参数-s

1.2.0管道

固定大小的缓存区,大小为一页,4k字节。用来输入输出重定向,把一个命令的输出当作另一个命令的参数

常用命令:

  1. grep查找
  2. sort排序(n数字排序,t指定分割符号,k指定第几列,r反向排序)
  3. uniq去重(-i忽略大小写,-c重复行数)
  4. cut截取,处理一行文本,(-f指定的列,-d分隔符)
  5. tr文本转换 tr a-z A-Z 转换大小写
  6. paste合并文件(带分隔符 paste -d : a.txt b.txt)
  7. split 分割文件,按行分割 -l,按大小分割 -b 64M

网络管理

ipconfig命令查看

  • eth是以太网第一块网卡,eth是ethernet的缩写,第二块就是eht1,以此类推
  • Link encap是封装方式:以太网
  • HWaddr是MAC地址
  • inet addr 是网卡当前ip地址
  • broadcast是广播地址
  • Mask是掩码
  • up是说明当前网卡是激活状态 down是关闭状态 ,可以ipconfig eth down
  • MTU代表最大存储单元
  • RX和TX是接受和发送的包

ip文件配置信息

/etc/sysconfig/network-scripts/目录下,ifcfg-eth0是第一块网卡

进程管理

进程分为三个状态:运行态,就绪态,阻塞态

进程之间存在互斥和同步的关系,互斥是不能同时运行,同步是通过通信方式实现信息交互

  • ps
    • -A列出所有进程,和-e差不多
    • -a 列出不和本终端有关的进程
    • -w 显示较多的信息
    • -u显示有效使用者相关进程
    • ps aux命令说明(ps是进程一瞬间的状态)
    • User:进程拥有者,

    • PID;pid,

    • %cpu:占用cpu,
    • MEM:占内存使用率,

    • VSZ:站虚拟内存,

    • RSS:占内存大小,

    • TTY:终端运行号码,

    • STAT进程状态(D不可中断,R运行,S休眠,R暂停,Z僵尸进程,W没有足够内存,#<高优先级,#N,低优先级)

    • Top是进程的动态展现
    • Kill 信号1代表重启 ,信号-9是强行重启(可能会内存泄漏),信号15比较温和,正常退出
    • Killall可以根据进程名来结束进程
    • lsof(list open files)列出当前系统所有打开文件的工具
    • 常用参数列表
    • lsof filename 显示指定文件所有进程
    • lsof-c string 显示command包含指定字符串的进程打开的文件
    • lsof-u username 显示user进程打开的文件
    • lsof-g gid 显示归属于gid进程打开的文件
    • lsof +d 显示目录下打开的文件
    • lsof +D 跟上面一样,递归文件夹
    • lsof +FD 显示指定文件描述进程
    • lsof-n 不转换ip为hostname
    • lsof-i 用以显示符合条件的进程
    • lsof-i[][protocol][@hostname][hostaddr][:server(server服务名称)|port]
    • 进程优先级调整nice和renice(TOP命令中的NI)默认nice是0,普通用户可以设置0-19()优先级=优先级+nice优先级,nice用于启动,renice用于重新设定(-p设置pid)

VIM

多行编辑,块模式快捷键ctrl+v

h左移,j下移,k上移,l右移

/sting用来查找 n是向上,N是向下

s/old/new /g替换old为new

,#s/old/new /g ##代表行号区间

像当前文件插入文件内容用 :r filename

o是光标下一行开始编辑,O是上一行

y是复制选中,yy是复制当前行,p是粘贴,pw是粘贴一个单词

正则表达式

  • .:匹配除了换行符的任意一个字符
  • *匹配前一个字符任意或者多次
  • \{n,m}\:匹配前一个字符的重复次数
  • ^:匹配开头,$匹配结尾
  • []:匹配方括号内的任意字符
  • \:转义字符
  • \<,\>:匹配单词的左右边界
  • \d:匹配数字
  • \b sting \b :匹配string单词边界
  • \B 匹配单词非边界
  • \w 匹配字母数字下划线,等价[a-zA-Z0-]
  • \W 匹配非字母数字下划线
  • \s 匹配任意空白字符,\S匹配任意非空白字符

扩展字符

  • ?:匹配前一个字符0-n次
  • +:匹配前一个字符1次以上
  • |:多种可能
  • ():和|混用,更加灵活

通配符(多用在文件名的匹配)

  • *,?,[],^/!(和[]用,代表取反)

POSIX字符

#[:alnum:] 文字数字字符
#[:alpha:] 文字字符
#[:digit:] 数字字符
#[:graph:] 非空字符(非空格、控制字符)
#[:lower:] 小写字符
#[:cntrl:] 控制字符
#[:print:] 非空字符(包括空格)
#[:punct:] 标点符号
#[:space:] 所有空白字符(新行,空格,制表符)
#[:upper:] 大写字符
#[:xdigit:] 十六进制数字(0-9,a-f,A-F)

2020年2月4日

sed (stream editor)非交互流编辑器

https://opus.konghy.cn/sed-refer/ sed 说明文档

https://www.jianshu.com/p/9d9a34e2b2dd 常用命令说明

命令是/斜杠,不是反斜杠

一般情况不改变本身文件,将修改后的文本输出到终端,以行为单位处理,处理完成一行就打印一行,用于删除,查找替换,插入,从其他文件读入数据

-e参数用来连接两个参数以上的命令 (sed -e ‘string’ -e ‘string2’或者sed 'string;string2')

删除命令:-d参数用来删除指定的行(1d:第一行,1,3d:1-3行,1,\$:1-末行,5!d:除了第五行都删除,/sting/d:包含sting的行,/^$/d:删除空行)

替换命令:-s替换文本内容:默认只替换每一行遇到的第一个,命令为's/sting/sting2/'(结尾有杠),杠后面是数字代表匹配次数,/g代表全局匹配,开头是/^sting.

字符转换:-y命令是转换,sed ‘y/1234/4567/’ 替换1234对应4567

插入文本:i或者a命令,i代表之前插入,a代表之后插入(命令:sed '2 i|a string ')在匹配单词后插入sed '/string/i\string2'

打印文本:-p,是删除的逆操作,使用时候要用-n参数(只显示匹配,或者处理过的行)sed -n 's/sting1/string2/p'

写入文件:-i参数,或者w命令,sed -n '1,2 w output'

使用脚本:写入sed命令到文件中,用-f指定文件

高级使用:sed中有两个空间,一个是模式空间(当前输入的缓冲区),一个是存储空间(预留的缓冲区),

https://www.cnblogs.com/fhefh/archive/2011/11/14/2248942.html sed n和N模式说明

分号号的含义就是将前面的处理完结果传给后边的表达式继续处理。

我们也可以对多个命令用大括号 进行组合,然后作用于同一匹配地址

选择要处理行的范围,可以用逗号(,)来分割。/sting/,/sting2/

H:将模式空间的内容追加的存储空间

h:将模式空间的内容复制到存储空间,覆盖原有存储空间

G:将存储空间的内容追加的模式空间

g:将存储空间的内容复制到模式空间

awk基于列的文本处理工具

Shell

简介:1.分为两类,GUI(图像终端)和CLI(命令行),学习shell脚本就是为了自动化

  • 运行:

    • 用程序运行,比如sh,
    • bash,加执行权限运行./*.sh,
    • 加入\$path目录中,直接运行
  • 调试:

    • 多练习脚本语法
    • echo查看执行情况
    • bashdb程序查错
  • 内建命令:bash自带的命令,不是/bin目录中的命令

  • type来查看内建命令

  • ./:执行当前命令 没有权限就会报错

  • source:跟./差不多,还能返回一个执行情况,并不会新建进程

  • alias:可以创建别名,格式 alias myShell='echo abc',unalias是删除别名

  • 家目录的.bashrc

  • 任务前后台切换:bg、fg、jobs,ctrl+z,fg和&是将任务放入后台,先c-z放入后台,bg是后台执行,fg是前台执行,直接运行用&放入后台,zsh中要用fg %1执行命令,jobs是显示后台运行的命令

  • 声明变量 declare和 typeset

    • -r是只读
    • -a是数组(declare-a arr='([0]="a",[1]="b")')
    • -F显示定义函数,-f显示函数体内容
  • eval 将所跟的参数作为shell命令执行

    • 用法1:将字符串执行为命令(a='ls -al';eval $a)(等号之间不能有空格)
    • 用法2:根据变量确定实际值(动态获取有规律的变量,比如name1,name2,name3,eval echo "\$"name$num)
    • 用法3:将一个变量的值当作变量名,并被赋值(name1,name2,eval $name1="\$name2")
    • 单双引号都是为了解决字符串中的空格
      单引号将剥夺其中的所有字符的特殊含义
      双引号中的'$'(参数替换)和'`'(命令替换)是例外,如果需要在双引号””里面使用这两种符号,需要用反斜杠转义。
  • exec内建命令,执行完命令就关闭终端(不启动新进程,把当前进程替换为新执行的进程,并结束进程)

  • export:默认情况shell的父进程变量,不能被子进程获取,用export之后,子进程也可以访问,父进程和子进程变量在各自的空间,不通用

  • let:整数运算。可以支持自增,自减等C++特性

  • local:局部变量,定义在函数体中

  • read:读取一个变量 read N

  • return:函数返回值 return N

  • shift偏移脚本参数:执行一次,推没一个参数,比如ABC执行后剩下BC

  • test测试表达式:test Expression

  • chsh(change shell)默认更改终端

Shell编程基础

1.变量,弱类型变量,不需要指定类型,也不需要先声明在使用,变量用来控制脚本运行

2.局部变量,在某个shell中生效的变量,对其他shell来说无效,local显式的说明变量

3.全局变量:全局变量可以共享给子shell,孙子shell,但不能给同级用

4.预设环境变量

  • CDPATH命令用于快速进入某个目录,CDPATH='/var/www',然后用cd html可以直接进入/var/www/html

  • EUID:记录当前uid

  • FUNCATION在函数体内部使用,记录当前函数名

  • HISTCMD记录下一条命令在history中的编号

  • HISTFILE记录history文件位置,history就是查询这个,默认在home下的.bash_history

  • HISTFILESIZE更改history记录条目数量

  • HISTSIZE是history中的缓冲区

  • HOSTNAME主机名

  • HOSTTYPE主机架构类型

  • MACHTYPE,主机类型GNU表示,结构为主机架构-公司-系统-gnu

  • LANG是当前设置的语言环境

  • OLDPWD记录之前的目录

  • PATH,命令搜索路径

  • 等等变量,用man bash查看

shell变量区分大小写,下划线和数字开头

变量赋值等号两边没有空格

取值就是\$var或者\${var},后面的方法更严谨

设置脚本变量定义:必须先声明在使用 shopt-s-o nounset

取消变量 unset

\$?永远是上一个命令的返回值

数组,1.声明数组,2赋值数组,3使用数组

  • declare-Array name来声明数组,name[0]='1'来赋值,数组取值\${name[]},
  • 数组个数用@或者*将数组扩展,然后用#来取得个数)\${#array[@]},
  • 数组截取:${array[@]:1:2}

只读变量:readonly 声明

变量的作用域: 不同的shell则为不同的命名空间

转义和引用:普通字符(literal)和元字符(meta)

  • 转义使用\,需要转义的字符如下

Linux引用,一共有四种方式,分别是双引号,单引号,反引号,转义符

  • 双引号,双引号称为部分引用,或者弱引用,引用除了\$,反引号,转义符之外的所有字符,输出变量的方式有两种,一是直接输出\$var,而是引用输出"\$var",引用输出的好处在于保留原来的格式
  • 单引号,单引号称为全引用,强引用,可以引用所有字符,单引号双引号连续使用是拼接效果“a”c“v” 输出acv
  • 反引号,将反引号的内容解释为系统命令,等同于/$(),/$()支持嵌套,反引号不支持,/$()只能在bash中使用,不能再unix中使用
  • 转义符:

运算符

let的自增自减,位运算

其他运算符:

  • \$[]简单运算符,和$((算术表达式))类似,做简单运算
  • expr运算符,需要把操作数和操作符隔开
  • bc运算(一种高精度语言):最简单就是使用bc进入交互式界面
    • scale:用来设置精度
    • 一行赋值一次
    • 命令行调用可以写好脚本
    • 用|结合使用 bc命令
    • echo -E命令默认禁用转义 -e是开启转义

特殊字符

通配符

  • *,代表任意长度的字符串,不包含.和斜线号
  • ?,匹配任意单字符
  • [],匹配其中任意字符,-可以用来当做起止,-在[]之外就是普通字符,星号和问号在[]其中就是普通字符

注释符#,加上#!不会被理解为注释,并且只能在第一行

大括号:在shell中用法很多,常用的就是引用型变量,也称变量扩展

变量扩展

image-20200208182830799

通配符扩展:匹配多个排列组合比如{a,b}{c,d},生成ac ad bc bd

匹配不同的文件:file{Name,name},就是filename和fileName都匹配

测试

  • test expression,expression是一个表达式
  • [ expression ] 推荐这种写法,需注意中间的空格

文件测试

需要重点注意的几个:

-e 文件或者目录存在时候返回真

-l 当文件为连接文件

-p 当文件为管道文件

-s 当文件大小不为零时候为真

-g -u:分别是gid和uid被设置的情况为真

-k 当文件设置了stieky属性则为真

-G -O是设置了有效的用户组和用户时候返回真

FILE1 -nt /-ot FILE2 :nt是1比2新的时候返回真,ot是相反(Newer than,Older then)

字符串测试

整数测试

逻辑测试与运算

不同点就是测试要在[]中,运算则是直接连接

逻辑测试(用于多个条件连接测试)
  • !非 !expression
  • -a 与 expression -a expression1 都是真,则为真
  • -o 或者 expresission -o expresission 一个为真,则为真
逻辑运算符
  • ! 取反
  • && 都是真,则为真
  • || 一个为真,则为真

判断

if判断结果
if expression ; then
    command
fi
case判断结果
case VAR in
    var 1) command1;;
    var 1) command1;;
    *)     command1;;
esac

循环

for循环
for VARIABLE in (list)
do
    command
done
//类c循环
for((expression1;expression2;,expression3))
do
    command
done
//可以在exception1中初始化多个值,在expression3中修改多个值,其中逗号分隔
while循环
while expression
do
    command
    #exit是退出脚本
    #break是终止循环
    #按行读取是while常用的一个用法,一般是用来格式化文件
done
无限循环的脚本 while((1)) | while true | while :
until
#until循环也是运行前测试(先判读,在执行),until采用测试真假值的方式,测试为假则执行,为真则停止
#无限循环用法:((1))((0))
until expression
do
    command
done
select循环
#默认将list容器中的元素生成1.2.3.的列表,按回车是从新生成,而不是退出
#和case搭配使用,select确认用户输入,case来捕捉处理
select MENU in (list)
do
    command
done
循环控制

break 终止当前整个循环体

continue 结束当前循环,进入下一次循环

函数

函数定义的关键字是function
function funname(){}
funname(){} #函数可以省略关键字
函数的返回值

函数的返回值用return

带参数的函数

调用\$1$2等等来执行命令

指定位置参数(用set指定,也叫重置)
#输入参数 a b c e
set 1 2 4 5 
echo $*就是 1 2 4 5 #被重置了
自定义函数库

导入函数库用source或者.命令

函数库/etc/init.d/functions

/etc/init.d目录 存放开机脚本的目录

递归函数

自己执行自己,需要有条件跳出循环,不然成了死循环

重定向

重定向就是提供输入输出操作,键盘,鼠标
文件标识符和标准输入输出(0-9)
  • 标准输入 stdin 0
  • 标准输出 sdout 1
  • 标准错误输出 stderr 2
  • 其他 从3开始标识
I/O重定向符号和用法
  • >标准输出重定向:将命令的输出重定向到其他文件中
  • >标准输出追加重定向:将命令的输出重定向到其他文件中,并覆盖源文件已有内容
  • & 标识输入重定向:将一个标识的输出重定向到另一个标识的输出
  • <标准输入重定向:将从指定文件读取输入而不是键盘
  • |管道:从一个命令中读取输出并作为另一个命令的输入

Ares个人进阶之路