概述
1、shell是什么
Linux中的shell用于保护Linux内核不被轻易修改,用户通过shell与Linux内核进行交互
Shell是一个命令行解释器,它为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序。用户可以用Shell来启动、挂起、停止、编程等操作。
Shell是指一种应用程序,这个应用程序提供了一个界面(终端),用户通过这个界面访问操作系统内核的服务。
Shell还是一个功能强大的编程语言、编写方面、调试方便、灵活性强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。因为是解释性语言,所以Shell不需要去编译,整体检查出无语法错误才可执行,而是写一行解释一行,直到有错误的语句才报错
2、查看当前系统的shell
- 查询系统有哪些shell:cat /etc/shells
- 查询当前使用的shell:echo $SHELL
权限相关命令
1、切换用户su
su root:切换到root用户,root不写时作用一样
su -:(不会改环境变量,没法验证)验证su 和su-区别
su -c <命令> <用户名>:使用指定用户来执行某个命令,之后再回到原来的用户
如:su -c ls root,使用root用户执行ls命令,之后再回到原来的用户
su -l <用户名>:切换到指定的用户,<用户名>不写时,切换为root用户
当在执行完一些指令后,想返回原用户,可以输入exit即可退回原用户。
当使用该命令后出现如下报错,代表没有设置过这个用户的密码。
su -l root 与 su root 的区别:(不会改环境变量,没法验证)
su -l root不仅将用户改为root,而且环境变量改为root用户的环境变量。
su root只是把用户改为root,但环境变量不改变
2、设置用户密码
sudo passwd <用户名>:修改指定用户的密码,不写<用户名>时,代表修改当前用户的密码
3、修改文件权限
文件权限格式:<inode><类型><权限><硬链接><文件主><文件组><大小><时间><名称>
修改文件权限:
相对赋值:chmod <who> <操作符号> <权限> <文件名>
- who:改变谁的权限,有u、g、o、a
- 操作符号:有+、-、=
- 权限:有r、w、x
绝对赋值:chmod 0xxx <文件名>,0代表八进制
- 例如rwxr--r-x,就相当于111 100 101,即:赋值0745
基本命令
1、帮助手册man
man的标题有以下分类,红色为指令的常用查询点:
- NAME:命令的名称
- SYNOPSIS:命令的语法格式
- DESCRIPTION:命令的一般描述以及用途
- OPTIONS:描述命令所有的参数或选项
- SEE ALSO:列出联机帮助页中与该命令直接相关或功能相近的其他命令
- BUGS:解释命令或其输出中存在的任何已知的问题或缺陷
- EXAMPLES:普通的用法示例
- AUTHORS:联机帮助页以及命令的作者
man手册的功能如下,红色为应用层编程常用查询点:
- 1:命令(man后不加数字时,默认为man 1)
- 2:系统调用提供的函数接口
- 3:库函数,比如C库、数学库
- 4:特殊文件,主要指的是/dev下的设备文件,与驱动有关
- 5:文件配置
- 6:游戏
- 7:杂项
- 8:超级用户的命令
- 9:内核相关的命令
man指令的使用方法:
使用man查询时,需要知道对应的功能。比如要查询printf函数的使用,不能直接man printf,而应该man 3 printf。这里的3是因为printf是库函数,属于man手册的第3个。
- man printf 出来的内容:
- man 3 printf 出来的内容:
2、打印系统时间
命令:
date + <格式>
格式有如下:
- %T:当前时间
- %Y:当前年份 %m:当前月份 %d:当前几号
- %H:当前几点 %M:当前几分 %S:当前几秒
举例:
- 查询当前的时间:date +%T
- 查询当前的年月日:date +%Y/%m/%d。' / '可换成其他字符串,这里只是习惯用' / '表示日期
- 查询当前时间:date +%H:%M:%S。' : '可换成其他字符串,这里只是习惯用' : '表示时间
加提示符:
- date + " 提示字符<格式> " ,这时提示符中可以有空格
- date +提示符<格式>,这时提示符与格式之间不能有空格
基于当前时间加减时间段后输出:
-d " +n hour ":当前输出的时间+n小时
-d " +n month ":当前输出的时间+n个月
-d " +n day ":当前输出的时间+n个天
3、打印系统磁盘使用情况
命令:
df <选项>
选项如下:
- -a:列出所有文件系统
- -k:列出磁盘的分配情况(KB)
- -h:同-k,但大小以G、M,K单位显示
- -l:仅列出本地文件系统
命令:
du <选项>
选项如下:
- -a:列出所有的对应目录及子目录所占大小
- -h:列出磁盘的使用情况(KB)
- -s:列出总的占用空间(KB)
输入输出操作
1、输出echo
命令:
echo <选项> <内容>
选项:
- -n:echo默认打印一个换行,加上-n不打印换行
- -e:使能转义,即能够识别 \n 这种转义符
- -E:失能转义,没有选项时候,默认选项为-E
举例:
打印变量值:
- 变量赋值常量:变量名=变量值,等号两边不能有空格。
- 变量赋值命令打印值:变量名=`命令`,等号两边不能有空格。
- 变量引用:"$变量名"
- 原样输出:'原样输出内容'
举例:
2、输出重定向
什么是重定向:
重定向就是改变默认的标准输入/输出目标,重新定向到新的目标。
默认输出位置:
- 标准输入:(stdin,文件描述符为0):默认从键盘输入
- 标准输出:(stdout,文件描述符为1):默认输出到屏幕(终端)。
- 标准出错:(stderr,文件描述符为2):默认输出到屏幕(终端)。
使用重定向的原因:
- 当屏幕输出的信息很重要时,而且希望保存重要的信息时
- 后台执行中的程序,不希望它干扰屏幕正常的输出结果时
- 系统的例行命令,例如定时任务的执行结果(日志),希望他可以存下来
- 一些执行命令,我们已经知道他可能出现错误信息,想把它直接丢掉时
- 执行一个命令,可能报错和正确的输出并序,类似错误日志与标准正确日志需要分别输出至不同的文件。
输出重定向符号及含义:
- 覆盖符号:>
- 追加符号:>>
- 重定向标准输出
- >file:新建/覆盖 file文件,把内容输出到file文件中,原内容被删除
- >>file:新建/追加 file文件,把内容追加到file文件中,原内容不会删除
- 重定向标准错误
- 2>file 或 &>file:新建/覆盖 file文件,把错误输出到file文件中,原内容被删除
- 2>>file 或 &>>file:新建/追加 file文件,把错误追加到file文件中,原内容不会删除
- 将标准错误和标准输出都重定向:
- > file 2>&1:新建/覆盖 file文件,把内容/错误输出到file文件中,原内容被删除
- >> file 2>&1:新建/追加 file文件,把内容/错误追加到file文件中,原内容不会删除
3、输入重定向
输入重定向符号及含义:
- < file:输入符,将file的内容作为xxx的输入
- << 字符:结束符,将指定的字符作为结束符
- < file1 > file2:将file1的内容作为输入,输出结果存入file2
4、通配符
符号含义:
通配符 | 含义 |
* | 匹配任意长度的字符串 |
? | 匹配一个长度的字符 |
[...] | 匹配一个长度的指定范围的字符 |
[ - ] | 匹配一个长度的指定范围的字符 |
[^...] | 匹配一个长度的除了该指定范围的字符 |
举例:
5、管道
管道的作用是把第一个命令的输出放入管道,下一个命令从管道中取出数据作为当前的输入。
举例:打印文件的内容的行数
wc -l 打印行数
注意:管道前面的命令必须有输出结果
6、查找历史命令
history:打印历史使用的命令
键盘" ↑ ":选择上一条命令
!字符串:最近的一条以指定字符串开头的命令
7、命令置换
命令置换的符号为:`命令`
作用1:给变量赋值命令的输出值
作用2:把命令的输出值作为命令的参数
文件相关命令
1、查看文件内容
cat:从0行到最后一行打印内容
tac:从最后一行到0行打印内容
more:分页显示,按回车向最后一行移动,但不能向0行移动,到最后一行自动退出查看
less:分页显示,按↓向最后一行移动,按↑向第0行移动,按q退出查看
head:默认显示文件的前10行
2、硬链接和软连接
硬链接与软连接的区别:
- 硬链接是利用Linux中为每个文件分配的物理编号——inode建立链接(硬链接创建的文件与与原文件的inode号一样)。因此,硬链接不能跨越文件系统。
- 软链接(符号链接)是利用文件的路径名建立链接(类似Windows中的快捷方式)。通常建立软链接使用绝对路径而不是相对路径,以最大限度增加可移植性。
- 不论是软连接还是硬链接,都可以通过链接去修改原文件的内容。
- 修改文件名对软连接有影响,对硬链接没影响。如果修改硬链接的目标文件名,硬链接访问原文件不受影响,因为它们的inode号一样,访问的空间一样。如果修改软连接的目标文件名,软连接访问原文件则失败,因为软连接是通过路径访问原文件,文件名改变代表路径改变,因此访问不到文件。
- 删除再创建文件对软连接没有影响,对硬链接有影响。如果删除一个文件,再创建一个同名的文件,这时inode号发生了改变,硬链接的inode号与新文件的inode号不一致,因此访问不到,但这并不是意味着文件丢失,通过硬链接依旧可以访问被删除的文件,并且内容依旧存在。因为新文件的名称没有改变,那么文件的路径没有改变,所以软连接可以继续访问。
- 硬链接常常用于文件的备份,软连接常常用于作为快捷方式。
查看文件的inode号:
命令:ls -i <文件名>
创建硬链接:
命令:ln <文件名> <创建的硬链接名>:给指定的文件创建硬链接
硬链接与原文件的inode号是一样的,这代表它们是一个东西。
创建软连接:
命令:ln -s <文件名> <创建的软链接名>
3、查找文件
命令:
find <起始目录> <选项>
作用:
从起始目录开始,找到全部符合条件的文件,并打印文件的路径
选项如下:
- -name <文件名>:查找文件名匹配所给字串的所有文件,字串内可用通配符*、?、[ ]。
- -iname <文件名>:忽略大小写的方式查找
- -type <类型>:查找指定类型的文件。
f:普通文件;l:链接文件;d:目录文件
- 与、或、非连接符:-a(可省略)、-o、!
-exec <命令> {} \; 将找到的文件进行一些其他命令的操作。
4、查找文件内容
命令:
grep <选项> "查找字符串" <文件>
选项:
- -A n:多显示一下查找到的内容的下n行
- -B n:多显示一下查找到的内容的上n行
- -C n:多显示一下查找到的内容的上下n行
- -i:忽略大小写进行查找
- -n:显示查找到的内容所占文件中的行号
- -r:查找的目标为目录时使用,将遍历目录中的全部文件进行查找内容
5、文件内容处理
5.1 裁剪文件内容cut
命令:
cut <选项> <内容>
选项如下:
- -b n:以字节为单位取出固定字符区间
- -c n:以字符 的单位取出固定字符区间
选择多个字符用" , "隔开,选择范围用" - "连接
- -d "分隔符":以指定分隔符进行分割
- -f n:取出分隔后的内容的第n段
选择多个段用" , "隔开,选择范围用" - "连接
5.2 查看、修改文件内容sed
命令:
sed <选项> '命令' <文件>
选项与命令如下:
- -n:取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
- n p命令:打印第n行
- -i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
- n a命令:追加,在第n+1行写入内容
- n i命令:插入,在第n行写入内容
- n d命令:删除第n行的内容
- 范围s/原内容/新内容/g:替换内容,与vi的替换语法一致
5.3 按列查看文件内容awk
命令:
awk '{print 范围}' <文件>
- $0:打印全部
- $n:打印第n列内容,列的分隔符由FS决定,为空格或制表符
- NF:返回记录的字段数目,即:最后一列的序号
- NR:返回当前记录的行号
- -F '分隔符':以指定的分隔符进行分隔,默认是空格作为分隔符
- $n==xxx {print $0}:判断条件之后打印。
比较符>、<、==、!=都可以使用,$0范围也可根据需求改变
- $n="xxx" {print $0}:赋值改变第n列,之后打印全部内容
注意:赋值需要加上双引号" "
6、解压缩文件
归档与压缩:
- 归档文件是将一组文件或目录保存在一个文件中。
- 压缩文件也是将一组文件或目录保存一个文件中,并按照某种存储格式保存在磁盘上,所占磁盘空间比其中所有文件总和要少。
- 归档文件仍是没有经过压缩的,它所使用的磁盘空间仍等于其所有文件的总和。因而,用户可以将归档文件再进行压缩,使其容量更小
6.1 gzip与gunzip
功能:
将一个文件压缩成.gz格式的压缩文件。但每次只能压缩一个文件,不能压缩目录,压缩后生成相应名字的压缩包。
命令:
gzip/gunzip <文件名>
示例1:正常使用,压缩一个文件
示例2:压缩2个文件,不会进行归档,而是产生两个.gz压缩包
示例3:验证gzip不能压缩目录
6.2 bzip2和bunzip2
该组指令与gzip/gunzip的使用完全一样,唯一的区别是它相比于gzip提供了最大限度的压缩比率,性能优于gzip。压缩后缀为.bz2
6.3 zip和unzip
压缩后的文件后缀名为.zip,可以压缩目录,对多个文件进行归档,并且压缩后原文件保留。
使用zip可以方便在Linux和微软Windows间交换文件。
命令:
zip/unzip <压缩包名> <文件名>
示例1:正常使用,压缩两个文件
示例2:zip实际是添加文件到压缩包中
6.4 tar
命令:
tar <选项> <归档/压缩文件名> <归档/压缩的文件>
选项:
- -t:显示归档文件的内容
- -x:释放归档文件
- -c:创建一个新的归档文件
- -r:追加的方式归档文件
- -v:显示归档和释放的过程信息
- -f:用户指定归档文件的文件名,否则使用默认名称
- -j:由tar生成归档,然后由bzip2压缩
- -z:由tar生成归档,然后由gzip压缩
示例1:查看压缩文件、归档文件的内容,选项为-tvf。
示例2:归档文件相关操作
- 新建归档文件,选项为-cf,归档文件以.tar为后缀
- 查看归档文件,选项为-tvf
- 释放归档文件,选项为-xvf
示例3:bzip2压缩文件相关操作
- 新建bzip2的压缩文件,选项为-cjf,归档文件以.tar.bz2为后缀
- 查看压缩文件,选项为-tvf
- 释放压缩文件,选项为-xvjf
示例4:gzip压缩文件相关操作
- 新建gzip的压缩文件,选项为-czf,归档文件以.tar.gz为后缀
- 查看压缩文件,选项为-tvf
- 释放压缩文件,选项为-xvzf
示例5:追加方式归档文件
追加归档文件,选项为-rf。压缩文件无法追加
进程管理
1、查看进程状态
命令1(静态查看状态):ps -aux
- USER:进程所属的用户
- PID:进程号,进程的唯一标识
- %CPU:占有率
- %MEN:内存占有率
- STAT:进程的状态
- START:运行的开始时间
- TIME:运行的时间
- COMMAND:进程的名字
仅仅查找自己想要的进程信息:ps -aux | grep <进程名字>
命令2(静态查看状态):ps -elf
- UID:用户的id
- PPID:父进程的pid号
命令3(动态查看状态):top,按q退出
- PR:优先级
2、向进程发送信号
查看kill有哪些信号:kill -l
- 02 SIGINT:ctrl c发出的信号
- 09 SIGKILL:进程终止信号
- 10 SIGUSR1:给用户预留的信号
- 12 SIGUSR2:给用户预留的信号
- 13 SIGPIPE:管道炸裂时发出的信号
- 15 SIGTERM:kill不指定信号时,默认发送的信号
- 29 SIGIO:输入输出用到的信号
向进程发送信号:kill <信号> <进程pid>
用户管理
1、相关文件
/etc/passwd:
/etc/passwd文件是系统能够识别的用户清单。用户登陆时,系统查询这个文件,确定用户的UID并验证用户口令。存储内容以" : "进行分隔,内容含义依次为:登录名、经过加密的口令(密码)、UID(用户ID)、默认的GID(用户组ID)、个人信息、主目录、登录shell。个人信息包含:用户全名、房间号、工作号码、家庭号码、其他信息(用,隔开)
例如下图,以linux用户为例,包含的信息为:登录名为linux,UID为1000,GID为1000,主目录为/home/linux,shell为/bin/bash
/etc/group:
包含了UNIX组的名称和每个组中成员列表每一行代表一个组。存储内容以" : "进行分隔,内容含义依次为:组名、加密的口令、GID号、成员列表(用,隔开)。
例如下图,以linux组为例,包含的信息为:组名为linux,GID为1000,没有成员
2、相关命令
添加用户:sudo adduser <用户名>
查询用户的id信息:id <用户名>
能够查询uid(用户id)、gid(主组id)、group(所属的所有组)
修改用户的密码:sudo passwd <用户名>
修改用户组:sudo usermod -G <组名> <用户名>
修改用户家目录:sudo usermode -d <修改后的家目录> -m <进行修改的用户>
修改的家目录的格式为:/home/新名字】
注意:不能修改当前正在使用的用户的家目录
修改用户名:sudo usermod -l <新用户名> <要修改的用户>
删除用户及其家目录:sudo deluser --remove-home <用户名>