4.Linux_Shell命令

概述

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):默认输出到屏幕(终端)。

使用重定向的原因:

  • 当屏幕输出的信息很重要时,而且希望保存重要的信息
  • 后台执行中的程序,不希望它干扰屏幕正常的输出结果
  • 系统的例行命令,例如定时任务的执行结果**(日志)**,希望他可以存下来
  • 一些执行命令,我们已经知道他可能出现错误信息,想把它直接丢掉
  • 执行一个命令,可能报错和正确的输出并序,类似错误日志与标准正确日志需要分别输出至不同的文件。

输出重定向符号及含义:

  • 覆盖符号:>
  • 追加符号:>>
  • 重定向标准输出
  1. >file:新建/覆盖 file文件,把内容输出到file文件中,原内容被删除
  2. >>file:新建/追加 file文件,把内容追加到file文件中,原内容不会删除
  • 重定向标准错误
  1. 2>file 或 &>file:新建/覆盖 file文件,把错误输出到file文件中,原内容被删除
  2. 2>>file 或 &>>file:新建/追加 file文件,把错误追加到file文件中,原内容不会删除
  • 将标准错误和标准输出都重定向:
  1. > file 2>&1:新建/覆盖 file文件,把内容/错误输出到file文件中,原内容被删除
  2. >> 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:归档文件相关操作

  1. 新建归档文件,选项为-cf,归档文件以.tar为后缀
  2. 查看归档文件,选项为-tvf
  3. 释放归档文件,选项为-xvf

示例3:bzip2压缩文件相关操作

  1. 新建bzip2的压缩文件,选项为-cjf,归档文件以.tar.bz2为后缀
  2. 查看压缩文件,选项为-tvf
  3. 释放压缩文件,选项为-xvjf

示例4:gzip压缩文件相关操作

  1. 新建gzip的压缩文件,选项为-czf,归档文件以.tar.gz为后缀
  2. 查看压缩文件,选项为-tvf
  3. 释放压缩文件,选项为-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 <用户名>

相关推荐
HPC_fac130520678165 分钟前
以科学计算为切入点:剖析英伟达服务器过热难题
服务器·人工智能·深度学习·机器学习·计算机视觉·数据挖掘·gpu算力
yaoxin5211231 小时前
第二十七章 TCP 客户端 服务器通信 - 连接管理
服务器·网络·tcp/ip
内核程序员kevin1 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
sinat_384241095 小时前
使用 npm 安装 Electron 作为开发依赖
服务器
朝九晚五ฺ6 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream6 小时前
Linux的桌面
linux
xiaozhiwise6 小时前
Makefile 之 自动化变量
linux
Kkooe7 小时前
GitLab|数据迁移
运维·服务器·git
久醉不在酒7 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql