Python学习笔记(七)之Linux编程

Pytho学习笔记(七)之Linux编程


文章目录


前言

Linux系统搭建以及相关命令记录


一、Linux系统概述与安装

1.Linux

在这里插入图片描述
Linux内核
Linux内核是 Linux 操作系统主要组件,也是计算机硬件与其软件之间的交互入口。它负责两者之间的通信,还要尽可能高效地管理资源
Linux Shell
shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口
Linux文件系统
文件系统是文件存放在磁盘等存储设备上的组织方法
Linux应用程序
标准的Linux系统一般都有一套都有称为应用程序的程序集,它包括文本编辑器、编程语言、办公套件等

2.虚拟机VM及虚拟机安装

VM安装成功:
在这里插入图片描述
安装Centos
官网地址:http://isoredirect.centos.org/centos/7/isos/x86_64/

在这里插入图片描述
创建虚拟机步骤:
1、主页点击创建虚拟机自定义:
在这里插入图片描述
2、硬件兼容性保持默认:
在这里插入图片描述
3、找到电脑中下载的磁盘iso文件进行安装:
在这里插入图片描述
4、给虚拟机命名,并且统一管理
在这里插入图片描述
5、虚拟机的内存及网络配置均保持默认:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
6、最后一步已完成配置准备创建:
在这里插入图片描述
7、创建完成之后,进行虚拟机安装:
在这里插入图片描述
8、选择中文后点击继续:
在这里插入图片描述
9、系统安装位置需要点击自动分区,无需设置,点击完成即可。
在这里插入图片描述
在这里插入图片描述

10、设置网络和主机名,将以太网按钮开启,获取ip地址
在这里插入图片描述
在这里插入图片描述
11、设置root密码,类似于超级管理员,创建用户为普通用户,此处设置超级密码为 123456
在这里插入图片描述
在这里插入图片描述

12、安装完成后重启,输入用户名和密码进入虚拟机:
在这里插入图片描述
在这里插入图片描述
安装过程中可能提示的报错:
在这里插入图片描述
原因是没有开启虚拟化,可能通过任务管理器查看:
在这里插入图片描述
解决方案:bing中搜索 “某某电脑 如何开启虚拟化” 按步骤即可

3.SHELL工具

安装MobaXterm和虚拟机进行连接:
在这里插入图片描述
打开允许右键粘贴功能
打开虚拟机查看ip地址为192.168.198.128,在moba中建立会话输入ip地址和用户名root
在这里插入图片描述
在这里插入图片描述
进入虚拟机
输入密码
此处输入的密码是moba需要设置的密码,当换电脑设备或者账户时需要重新输入,此处设置为1234567
在这里插入图片描述
点击ok后即可进去:
在这里插入图片描述

4.VMWare虚拟机快照

VMware虚拟机支持为虚拟机制作快照,通过快照将当前虚拟机的状态保存下来,在以后可以通过快照恢复虚拟机到保存的状态
在这里插入图片描述
快照制作需要虚拟机关机状态下
在这里插入图片描述
在这里插入图片描述
恢复快照:
在这里插入图片描述
想要回到哪个状态的时候,打开快照管理器,点击“转到”即可。
在这里插入图片描述

克隆虚拟机:
在这里插入图片描述

二、Linux基本命令

1. 目录结构

Linux的目录结构是一个树型结构,Linux没有盘符这个概念, 只有一个根目录 /(对比Windows下的C、D盘符), 所有文件都在它下面。
在这里插入图片描述
进入根目录查看所有文件:
在这里插入图片描述
每个标识的含义:
在这里插入图片描述
目录的解释
系统启动必须:

  • **/boot:**存放的启动Linux 时使用的内核文件,包括连接文件以及镜像文件。
  • **/etc:**存放所有的系统需要的配置文件和子目录列表,更改目录下的文件可能会导致系统不能启动。
  • /lib:存放基本代码库(比如c++库),其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
  • /sys: 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中。

指令集合:

  • **/bin:**存放着最常用的程序和指令
  • **/sbin:**只有系统管理员能使用的程序和指令。

外部文件管理:

  • /dev :Device(设备)的缩写, 存放的是Linux的外部设备。注意:在Linux中访问设备和访问文件的方式是相同的。
  • /media:类windows的其他设备,例如U盘、光驱等等,识别后linux会把设备放到这个目录下。
  • /mnt:临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。

临时文件:

  • /run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run目录,应该让它指向 run。
  • /lost+found:一般情况下为空的,系统非法关机后,这里就存放一些文件。
  • /tmp:这个目录是用来存放一些临时文件的。

账户:

  • /root:系统管理员的用户主目录。
  • /home:用户的主目录,以用户的账号命名的。
  • /usr:用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
  • /usr/bin:系统用户使用的应用程序与指令。
  • /usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序。
  • /usr/src:内核源代码默认的放置目录。

运行过程中要用:

  • /var:存放经常修改的数据,比如程序运行的日志文件(/var/log 目录下)。
  • /proc:管理内存空间!虚拟的目录,是系统内存的映射,我们可以直接访问这个目录来,获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件来做修改。

扩展用的:

  • /opt:默认是空的,我们安装额外软件可以放在这个里面。
  • /srv:存放服务启动后需要提取的数据(不用服务器就是空)

特殊的:

  • . :代表当前的目录,也可以使用 ./ 来表示;
  • :代表上一层目录,也可以 …/ 来代表;
  • ~ : 代表登录用户的家目录
    • root: /root
    • user: /home/user
  • / : 代表系统的根目录

2. 绝对路径和相对路径

路径指的是在文件系统中访问文件或目录时需要经过的路线:

  • 绝对路径: 路径的写法,由根目录 / 写起,例如: /etc/ssh 这个目录
  • 相对路径: 路径的写法,不是由 / 写起,例如由 /etc/ssh 要到 /etc/ssl 底下时,可以写成: cd …/ssl
    在这里插入图片描述
# /etc/ssh 到 /etc/python
../python


# /etc/ssh 到 /usr
../../usr


# /etc/ssh 到 /home/user/test
../../home/user/test


# /etc/ssh 到 /etc
../


# /etc 到 /etc/ssh
./ssh 或者 ssh

3. 命令基础

在Linux中,无论是什么命令,有什么用途,命令都有通用的格式:
command [-options] [parameter]

  • command: 命令本身
  • options:[可选,非必填] 命令的一些选项,可以通过选项控制命令的行为细节
  • parameter:[可选,非必填] 命令的参数值

3.1 ls命令

ls命令用于显示指定工作目录下内容,语法细节如下:
ls [-alrtAFR] [name…]

  • -a 显示所有文件及目录 (. 开头的隐藏文件也会列出)
  • -d 只列出目录(不递归列出目录内的文件)
  • -l 以长格式显示文件和目录信息,包括权限、所有者、大小、创建时间等。
  • -r 倒序显示文件和目录。
  • -t 将按照修改时间排序,最新的文件在最前面。
  • -A 同 -a ,但不列出 “.” (目前目录) 及 “…” (父目录)
  • -F 在列出的文件名称后加一符号;例如可执行档则加 “*”, 目录则加 “/”
  • -R 递归显示目录中的所有文件和子目录。
ls -l          # 以长格式显示当前目录中的文件和目录
ls -a          # 显示当前目录中的所有文件和目录,包括隐藏文件
ls -lh          # 以人类可读的方式显示当前目录中的文件和目录大小
ls -t          # 按照修改时间排序显示当前目录中的文件和目录
ls -R          # 递归显示当前目录中的所有文件和子目录
ls -l /etc/passwd    # 显示/etc/passwd文件的详细信息

在这里插入图片描述

4. 获取命令帮助

主要就是help 参数、man命令两种方式。
在这里插入图片描述
命令的配置
要查看命令的详细手册,man(manual手册),语法如下:
man command
默认显示的是英文。如果想要改成中文,需要系统是中文的,具体命令是如下:

[root@node1 ~]# echo $LANG
zh_CN.UTF-8 # 中文
en_US.UTF-8 # 英文

修改成中文

[root@node1 ~]# LANG=“zh_CN.UTF-8”

上面修改方式是临时的,重启后,会还原原来的样子
彻底解决方案:

修改 /etc/locale.conf文件,设置内容为LANG=zh_CN.UTF-8

安装中文包

[root@node1 ~]# yum install man-pages-zh-CN -y

命令的使用

  • j/enter 向下一行
  • k 向上一行
  • f/空格/PG Down 按页向下翻
  • b/Page UP 向上翻页
  • p 直接翻到首页
  • 查找按 / 要查找的内容
    • n查找下一个
    • N 上一个
  • q 退出

扩展使用

man命令后可以有一个数字,可以了解或者是直接查询相关的资料
man [数字][参数]

1 用户命令(/bin,/usr/bin,/usr/local/bin)
2 系统调用
3 库函数
4 特殊文件(设备文件)
5 文件格式(配置文件的语法)
6 游戏
7 杂项(Miscellaneous)
8 管理命令(/sbin,/usr/sbin,/usr/local/sbin)

5. cd与pwd命令的使用

cd
当Linux终端(命令行)打开的时候,会默认以用户的HOME目录作为当前的工作目录,可以通过cd命令,更改当前所在的工作目录,cd (change directory): 切换目录, 用来变换工作目录的命令:

cd [路径]

pwd
pwd (print work directory):显示目前所在目录的命令

[root@www ~]# pwd [-P]

-p 会不以链接档的数据显示,而是显示正确的完整路径
在这里插入图片描述

6.mkdir与rmdir的使用

mkdir
mkdir(make directory):创建一个新的目录

mkdir [-p] 目录名称

-p :直接将所需要的目录(包含上一级目录)递归创建起来
在这里插入图片描述

rmdir
rmdir(remove directory):删除一个空的目录

rmdir [-p] 目录名称

-p :从该目录起,一次删除多级空目录,把路径写全
在这里插入图片描述

7.cat_tac_more_less查看文件内容

cat 适合查文本内容较少的
cat 由第一行开始显示文件内容

cat [-AbEnTv]
-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字节 $ 显示出来;
-n :列印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符

tac
tac与cat命令刚好相反,文件内容从最后一行开始显示

more 适合查文本内容多的
一页一页翻动,看完就结束了,自动退出

more path
按键可以按:
空白键 (space) :代表向下翻一页
Enter :代表向下翻『一行』
/字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字
q :代表立刻离开 more ,不再显示该文件内容
b :代表往回翻页

less
一页一页翻动,看完还可以回翻

less path
按键可以按:
空白键 :向下翻动一页;
pagedown :向下翻动一页;
pageup :向上翻动一页;
/字串 :向下搜寻『字串』的功能;
?字串 :向上搜寻『字串』的功能;
n :重复前一个搜寻 (与 / 或 ? 有关!)
N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
q :离开 less 这个程序;

head 适合查看文件部分内容
取出文件前面几行,默认显示前10行

head [-n number] 文件
-n :后面接数字,代表显示几行的意思

tail
取出文件后面几行

tail [-n number] 文件
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的档名,要等到按下ctrl + c 才会结束tail的侦测

echo “” >> [文本]
在这里插入图片描述

8.cp_mv_rm命令 ——操作文件与文件夹

cp
cp(copy) 即拷贝文件和目录

cp [-adfilprsu] 来源档(source) 目标档(destination)
-a:相当于 -pdr 的意思,至于 pdr 请参考下列说明;(常用)
-d:若来源档为链接档的属性(link file),则复制链接档属性而非文件本身;
-f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
-i:若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l:进行硬式链接(hard link)的链接档创建,而非复制文件本身;
-p:连同文件的属性一起复制过去,而非使用默认属性(备份常用);
-r:递归持续复制,用于目录的复制行为;(常用)
-s:复制成为符号链接档 (symbolic link),亦即『捷径』文件

在这里插入图片描述

mv
mv(move) 移动文件与目录,或修改名称

mv [-fiu] 源文件/夹 目录文件/夹
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会升级 (update)
在这里插入图片描述

rm
rm (remove) 移除文件或目录

rm [-fir] 文件或目录
-f :就是 force 的意思,忽略不存在的文件,不会出现警告信息;
-i :互动模式,在删除前会询问使用者是否动作
-r :递归删除,最常用在目录的删除
在这里插入图片描述

注意
千万不要用root管理员用户执行:rm -rf / 效果等同于在Windows上执行C盘格式化

**通配符 ***

符号* 表示通配符,即匹配任意内容(包含空)
temp*,表示匹配任何以temp开头的内容
*temp,表示匹配任何以temp结尾的内容
temp,表示匹配任何包含temp的内容
在这里插入图片描述

9.which_find查找命令

which
which命令用于查找命令文件,在哪个目录

which 命令
在这里插入图片描述

find
在Linux系统中,我们可以通过find命令去搜索指定的文件

find 搜索的路径 -name “被查找的文件名”
在这里插入图片描述

10.grep_wc_管道符的使用

grep
grep(global regular expression print)是一种常用的文本搜索工具,用于在文本或文件中查找特定的字符串。

grep [-abcEFGhHilLnqrsvVwxy] pattern files
pattern - 表示要查找的字符串或正则表达式
files - 表示要查找的文件名,可以同时查找多个文件
-i:忽略大小写进行匹配。
-v:反向查找,只打印不匹配的行。
-n:显示匹配行的行号。
-r:递归查找子目录中的文件。
-l:只打印匹配的文件名。
-c:只打印匹配的行数。
在这里插入图片描述

wc
wc命令可以计算文件的Byte数、字数、或是列数

wc [-clw][–help][–version][文件…]
-c/–bytes或-m/–chars 只显示Bytes数。
-l或–lines 显示行数。
-w或–words 只显示字数。
–help 在线帮助。
–version 显示版本信息。
在这里插入图片描述

管道符 |
管道符号| 通过将前一个命令的输出直接传递给后一个命令作为输入,从而构建起用于多个命令的连接方式

例如:
在当前目录下查找所有以.txt结尾的文件名并输出到终端的功能
ls | grep .txt
列出目录/etc中以pass开头的文件或目录名
ls /etc | grep ^pass

查看当前目录下文件tmp.txt,将结果传递来 grep 过滤出包含66 ,将结果传递来 grep 过滤出包含 1 的数据
cat tmp.txt |grep 66 | grep 1

应用场景:

  • 数据处理:Linux管道符可以方便地用于对文件或文本进行处理
  • 系统管理:Linux系统管理员经常使用管道符来执行多个命令以达到管理系统的目的
  • 网络通信:在网络编程领域,管道符也被广泛应用

11.touch、echo的使用

touch
touch 命令在 Linux 操作系统中用于创建文件或修改文件的时间戳
如果指定的文件不存在,则会创建一个新的空白文件

touch 文件路径

常见用法
创建新文件
创建名为 file.txt 的新文件

touch file.txt

更改文件时间戳
更新名为 file.txt 文件的修改时间戳

touch file.txt
在这里插入图片描述

创建多个文件
创建三个名为 file1.txt、file2.txt 和 file3.txt 的文件

touch file1.txt file2.txt file3.txt

echo
echo 用于在终端上输出一些文本信息

echo [option] string

常见用法

输出字符串(最基本的用法)
在终端上输出 Hello, Linux 字符串

echo “Hello,Linux”

显示 Shell变量
命令将在终端上输出 Hello, Linux。

myvar=“Hello, Linux”
echo $myvar
在这里插入图片描述

输出到文件
可以使用重定向符号 > 将 echo 命令的输出保存到一个文件中,将 Hello,Linux! 并将其保存到一个名为 myfile.txt 的文件中

echo “Hello, Linux!” > myfile.txt

12.重定向符

重定向符包括 >, <, >>, << 等符号
常用用法
“>”:将命令的标准输出重定向到一个文件中,例如:

ls -l > file.txt
在这里插入图片描述

这个命令将列出当前目录下的文件,并将结果输出到一个名为 file.txt 的文件中。如果该文件不存在,则会创建它;如果存在,则会覆盖原有内容

“>>”:将命令的标准输出追加到一个文件中,例如:

echo “Hello, World!” >> file.txt

这个命令将在 file.txt 文件的末尾添加一行文本。如果该文件不存在,则会创建它

“<”:使用一个文件的内容作为命令的标准输入,例如:

sort < file.txt

这个命令将读取 file.txt 文件中的内容,并将其传递给 sort 命令,该命令对输入进行排序

“<<”:将一个字符串作为命令的标准输入,例如:

grep ‘hello’ << EOF
Hello, World!
Goodbye, World!
EOF
在这里插入图片描述

这个命令将使用 grep 命令来查找包含 hello 字符串的行。字符串 EOF 用于指定输入的结束,之间的文本将作为标准输入

注意:
重定向符号还可以结合管道符一起使用

ls -l | grep “.txt” > filelist.txt

这个命令将列出当前目录下的所有文件,并将其中包含 .txt 字符串的文件名保存到一个名为 filelist.txt 的文件中

13.VIM介绍和使用

13.1编辑器的三种模式

在这里插入图片描述
命令模式(Command mode)
命令模式下,所敲的按键编辑器都理解为命令,以命令驱动执行不同的功能,此模型下,不能自由进行文本编辑
输入模式(Insert mode)
也就是所谓的编辑模式、插入模式,此模式下,可以对文件内容进行自由编辑
末行模式(Last line mode)
通常用于文件的保存、退出,此模型下,不能自由进行文本编辑

13.2基本使用

打开文件

VIM命令若是没有,可以使用yum install vim -y安装

vim filename: 打开文件,并定位第1行
vim filename +# :打开文件,并定位于第#行
vim filename +:打开文件,定位至最后一行
vim filename +/PATTERN : 打开文件,定位至第一次被PATTERN匹配到的行的行首

注意
如果文件路径表示的文件不存在,那么此命令会用于编辑新文件
如果文件路径表示的文件存在,那么此命令用于编辑已有文件
打开文件后,默认是命令模式

编辑模式
在命令模式下,可以通过以下按键命令进入编辑模式

模式按键命令描述
命令模式i在当前光标的位置,进入编辑模式
命令模式l在当前行的开头,进入编辑模式
命令模式a在当前光标位置之后,进入编辑模式
命令模式A在当前行的结尾,进入编辑模式
命令模式o在当前光标下一行,进入编辑模式
命令模式O在当前光标上一行,进入编辑模式

关闭文件

模式按键命令描述
命令模式ZZ保存并退出
命令模式:q退出。没有动过文件
命令模式:wq保存并退出。动过了,不后悔
命令模式:q!退出。动过了,后悔了
命令模式:w保存,不退出

在编辑模式与末行模式通过Esc返回到命令模式

13.3 扩展使用

末行模式
在这里插入图片描述
永久增加vim中的行号,可以通过修改 ~/.vimrc文件,增加代码

set number
在这里插入图片描述

命令模式
在这里插入图片描述

14.cut命令

用来从一行文本中提取特定列、字段和字符等信息。

cut [option] [args] filename

  • s:不显示没有分隔符的行
  • d:指定分隔符对源文件的行进行分割
  • f:选定显示哪些列
    • m-n: m列到n列
    • -n: 第一列到n列
    • m-: 第m列到最后一列
    • n: 第n列
    • x,y,z: 获取第x,y,z列

常用用法

提取指定列

cut -f 1 filename

使用分隔符提取字段

cut -d ‘,’ -f 2 filename
在这里插入图片描述

指定字段范围

cut -d ‘,’ -f 2-4 filename

显示1,3,7列

cut -d ‘,’ -f 1,3,7 filename

如果有的行没有分隔符,则输出会包含脏数据

cut -sd -d ‘,’ -f -10 filename
在这里插入图片描述

将多个文件合并到一起,并从这些文件中提取信息,则可以使用以下命令

cat file1.txt file2.txt | cut -d ‘,’ -f 1,3

15.sort命令

sort 命令是一种非常实用的文本处理工具,它可以用来对文本文件进行排序

sort [options] [file]
选项
-n : 按数值排序
-r : 倒序 reverse
-t : 自定义分隔符
-k : 选择排序列
-f : 忽略大小写

常用用法

演示文本内容

a b 1
dfdsa fdsa 15
fds fds 6
fdsa fdsa 8
fda s 9
aa dd 10
h h 11

默认字典序排序

sort sort.txt

指定字段分隔符,按照第2个字段的字典序排序

sort -t ’ ’ -k 2 sort.txt

指定字段分隔符,按照第3个字段字典序排序

sort -t ’ ’ -k 3 sort.txt

指定字段分隔符,按照第3个字段的数值序排序

sort -t ’ ’ -nk 3 sort.txt

在这里插入图片描述

指定字段分隔符,按照第3个字段的值数值倒序

sort -t ’ ’ -nrk 3 sort.txt

排序完,输出到文件

sort -t ’ ’ -nrk 3 sort.txt > newfile

16.sed命令

sed 可以用于对文本进行替换、删除、插入等操作。

sed [选项] [脚本命令] 文件名

选项:

  • i : 此选项会直接修改源文件,要慎用

脚本命令:

  • d:删除符合条件的行
  • a\string:在指定的行后追加新行,内容为string
  • i\string:在指定行前添加新行,内容是string
  • s/string1/string2/:查找并替换,默认只替换每行第一次模式匹配到的字符串
    • g:行内全局替换
    • i: 忽略大小写
  • /regex/: 匹配某个数据
    • p:打印结果
    • w filename:输出到指定的文件

案例

Authentication improvements when using an HTTP proxy server.
Support for POSIX-style 8 filesystem extended attributes. filesystem
YARN’s REST APIs now support write/modify operations.

# 第一行下插入一行
[root@node1 ~]# sed "1a\hello world" sed.txt
# 直接修改文件
[root@node1 ~]# sed -i "1a\hello world" sed.txt
# 删除第2行
[root@node1 ~]# sed -i "2d" sed.txt
# 删除文档中的每一行
[root@node1 ~]# sed "d" sed.txt
# 将 filesystem 替换为 FS
[root@node1 ~]# sed "s/filesystem/FS/" sed.txt
# 忽略大小写
[root@node1 ~]# sed "s/filesystem/FS/i" sed.txt
# 不仅忽略大小写还要行内全局替换
[root@node1 ~]# sed "s/filesystem/FS/gi" sed.txt
#原来的内容要打印,匹配的行要打印,找到的行会打印两次
[root@node1 ~]# sed "/[0-9]/p" sed.txt
#匹配行中包含0-9 任意一个字符的行,只打印找到的行
[root@node1 ~]# sed -n "/[0-9]/p" sed.txt
# 匹配行中包含PATH的行,只打印找到的行
[root@node1 ~]# sed -n "/support/p" sed.txt
# 匹配行中包含PATH的行,将找到的行的内容写入到指定的文件中
[root@node1 ~]# sed -n "/support/w support.log" sed.txt
[root@node1 ~]# cat path.log 

在这里插入图片描述

17.awk命令

awk 常用于对文本文件进行分析、过滤和格式化。

awk [-F “:”] ‘pattern {action}’ filename
pattern:指定需要匹配的模式或条件,可以使用正则表达式或特定的内置变量
action:指定匹配成功后需要执行的操作,通常为输出或编辑指定的文本
filename:指定需要处理的文本文件名,如果不指定则默认从标准输入读取

内置变量
awk 命令提供了许多内置变量,可以用于获取特定行或列的信息:

  • NF:表示当前行的有多少列。
  • NR:表示当前处理的是文件中的第几行。
  • $0:代表整个当前行。
  • $1:代表当前行的第一个字段,依次类推。

例如,下面的命令会输出 file.txt 文件中每一行的第一个字段:

awk ‘{print $1}’ file.txt
在这里插入图片描述
Awk 操作符
awk 命令支持一些操作符,可以对文本进行过滤和格式化。以下是常用的一些操作符:

  • “~”:匹配正则表达式。
  • “!~”:不匹配正则表达式。
  • “==”:等于。
  • “!=”:不等于。
  • “<”:小于。
  • “>”:大于。
  • “<=”:小于等于。
  • “>=”:大于等于。

例如,下面的命令会输出 file.txt 文件中包含字符串 “Linux” 且第二个字段大于 20 的行:

awk ‘/Linux/ && $2 > 20 {print}’ file.txt

在示例中, && 表示逻辑与操作符,该命令只有当两个条件都被满足时,才会进行输出行的操作。

Awk 内置函数
awk 命令还提供了许多内置函数,可以用于对文本进行处理。以下是一些常用的内置函数:

  • length(string):返回指定字符串的长度。
  • substr(string, start, length):返回指定字符串的子串。
  • index(string, search):查找指定字符串中第一个匹配搜索字符串的位置。
  • toupper(string):将指定字符串转换成大写字母。
  • tolower(string):将指定字符串转换成小写字母。

例如,下面的命令会将 file.txt 文件中每一行的第一个字段转换成大写字母:

awk ‘{print toupper($1)}’ file.txt

在示例中,toupper() 函数将第一个字段中的所有字符转换为大写字母,并通过 print 命令进行输出。

案例

Name,Age,Gender,Country
Alice,25,F,USA
Bob,30,M,Canada
Cathy,18,F,China
David,28,M,UK
Emily,22,F,USA
Frank,35,M,Australia
Gina,32,F,Italy
Harry,40,M,USA
Ivy,27,F,China
John,45,M,Germany

# 输出第一列,即姓名
awk -F"," '{print $1}' file.txt
# 输出每个人的名字和国家,以逗号分隔
awk -F"," '{print $1,$4}' file.txt
# 输出年龄小于20的人的名字和国家
awk -F"," '$2<20 {print $1, $4}' file.txt
# 输出中国和美国出生的人的姓名和年龄
awk -F"," '$4 ~/China|USA/ {print $1, $2}' file.txt
# 将所有人的年龄增加 5 岁后进行输出,并将输出结果保存到文件中
awk -F"," '{$2+=5; print}' file.txt > newfi
awk -F"," 'NR>1 {$2+=5; print}' file.txt > newfile.txt

在这里插入图片描述
在这里插入图片描述

三、用户和权限

1. 用户和用户组

在Linux中,每个文件和目录都有一个所有者和属组,用于控制对它们的访问权限

Linux用户
无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理;
Linux 系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响;
不同用户具有不同的权限,毎个用户在权限允许的范围内完成不同的任务。

提示
在Linux系统中,拥有最大权限的账户名为:root(超级管理员)
而普通用户在许多地方的权限是受限的;
每个用户在自己家目录下,拥有最高权限;

Linux用户组
用户组是一组用户的集合,由管理员定义
目的就是更方便地管理和授予权限。同一用户组内的所有成员都具有相同的访问权,这些访问权取决于组的权限设置

用户与用户组的关系
在Linux中,每个用户都至少属于一个用户组,但也可以同时属于多个用户组
这些用户组定义了用户的访问权限,决定着用户可以执行哪些操作、访问哪些目录和文件等
在这里插入图片描述

2. 用户管理

添加用户

useradd [选项] 用户名
选项说明:
-c comment 指定一段注释性描述。
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 用户组 指定用户所属的用户组。
参数描述:
用户名:指定新账号的登录名

在这里插入图片描述

删除用户

userdel [-r] 用户名
选项说明:
-r,删除用户的HOME目录,不使用-r,删除用户时,HOME目录保留
在这里插入图片描述

查看用户信息
显示系统中所有现有的用户账户。

cat /etc/passwd

在这里插入图片描述

3. su、exit、sudo

超级用户与普通用户
在Linux系统中,拥有最大权限的账户名为:root(超级管理员)
普通用户的权限,一般在其HOME目录内是不受限的
一旦出了HOME目录,大多数地方,普通用户仅有只读和执行权限,无修改权限

su和exit命令
su命令就是用于账户切换的系统命令,其来源英文单词:Switch User

su [-l] 用户名
-l : 符号是可选的,表示是否在切换用户后加载环境变量
在这里插入图片描述

切换用户后,可以通过exit命令退回上一个用户,也可以使用快捷键:ctrl + d;
使用普通用户,切换到其它用户需要输入密码,如切换到root用户,使用root用户切换到其它用户,无需密码,可以直接切换。

sudo命令
在我们得知root密码的时候,可以通过su命令切换到root得到最大权限,但是不建议长期使用root用户,避免带来系统损坏。

也可以使用sudo命令,为普通的命令授权,临时以root身份执行

sudo 命令

在其它命令之前,带上sudo,即可为这一条命令临时赋予root授权,但是并不是所有的用户,都有权利使用sudo,我们需要为普通用户配置sudo认证。

为普通用户配置sudo认证
切换到root用户,执行visudo命令,会自动通过vi编辑器打开:/etc/sudoers
在文件的最后添加

用户名 ALL=(ALL) NOPASSWD:ALL

在这里插入图片描述
显示还是没有办法创建文件
在这里插入图片描述
在/etc/sudoers文件里加入命令
在这里插入图片描述
在test的用户权限下可以创建文件:
在这里插入图片描述
其中最后的NOPASSWD:ALL 表示使用sudo命令,无需输入密码

4.id与whoami 查看权限

id命令

id <用户名>

终端会输出当前用户的身份信息,其中包括uid和gid字段,分别表示用户ID和组ID。如果uid为0,则说明该用户是管理员
id 用户名,一般是管理员使用
在这里插入图片描述

whoami命令
whoami命令可以查看当前用户的用户名,但是不能直接判断该用户是否为管理员

whoami

**命令行的提示符号 # 或者 ∗ ∗ 命令行提示符中的 ** 命令行提示符中的 命令行提示符中的和#符号通常用来表示不同的用户或权限等级
但并不能直接判断当前用户是为管理员
$:该符号一般出现在非特权用户的命令提示符中,表示当前用户没有超级用户(root)的权限
#:该符号一般出现在超级用户(root)的命令提示符中,表示当前用户拥有最高权限

5.用户组管理

用户组是一组用户的集合,由管理员定义:
目的就是更方便地管理和授予权限。同一用户组内的所有成员都具有相同的访问权,这些访问权取决于组的权限设置
要在Linux中管理用户组,需要以root用户身份登录系统。

查看用户组

cat /etc/group
在这里插入图片描述

创建用户组

groupadd 用户组名

删除用户组

groupdel 用户组名

用户修改组
将用户添加到一个附加组中

usermod -aG 用户组名 用户名
在这里插入图片描述

将用户设置为指定组

usermod -G 用户组名 用户名
在这里插入图片描述

6.文件权限的查看

在这里插入图片描述
在这里插入图片描述
文件的类型

  • 表示文件
    d 表示文件夹
    l 表示链接

权限说明

  • r 读
    • 文件:查看文件内容
    • 文件夹:查看文件夹内容,如ls命令
  • w 写
    • 文件:修改此文件
    • 文件夹:在文件夹内:创建、删除、改名等操作
  • x 执行
    • 文件:可以将文件作为程序执行
    • 文件夹:可以更改工作目录到此文件夹,即cd进入
  • "- "无权限

7.chmod命令 修改权限控制

chmod命令是用来修改文件或目录权限的命令
通常,只有文件、文件夹的所属用户,或者有root权限的用户才能使用

通过chmod命令来对以下三种权限进行设置和变更

  • 文件所有者(Owner)拥有读、写、执行权限(rwx)
  • 同组用户(Group)拥有读、写、执行权限(rwx)
  • 其他用户(Others)拥有读、写、执行权限(rwx)

chmod命令的使用方法如下:

chmod [选项] 模式 文件名/文件夹

选项:-R,表示递归修改
模式:修改的权限
文件名/文件夹: 指定的目标文件或文件夹

模式
通过符号:
在这里插入图片描述

# 不考虑之前的权限(=),直接使用设定的方式:
chmod u=rwx,g=rx,o=rx test
# 还以省略为如下:
chmod u=rwx,go=rx test

#原有基础上修改(+,-)
chmod a-x test
#省略:
chmod +x test

通过数字:
权限用3位数字代表,第一位数字表示文件所有者,第二位数字表示同组用户,第三位表示其他用户
r记为4,w记为2,x记为1,:
0:无任何权限 , —
1:只有x权限, --x
2:只有w权限,-w-
3:有w,x权限,-wx
4:只有r,r–
5:r-x
6:rw-
7:rwx

# 修改权限为rwxr-x---:
chmod 750 test

在这里插入图片描述

8.修改文件所属者chown

chown是更改文件或者目录所有者的命令,可以将文件或目录的所有权转移到另一用户或组;
通常,只有文件、文件夹的所属用户,或者有root权限的用户才能使用。

chown命令的基本语法如下:

chown [选项] 用户名:组名 文件名

用户名和组名: 可以是任何有效的Linux用户或组名称
文件名: 是要修改其所有权的文件或目录名称
选项
-R:递归地更改文件夹及其子文件夹中的所有文件所有者

# 将hello.txt所属用户修改为root
chown root hello.txt
# 将hello.txt所属用户组修改为root
chown :root hello.txt
# 将hello.txt所属用户修改为root,用户组修改为python
chown root:python hello.txt
# 将文件夹test的所属用户修改为root并对文件夹内全部内容应用同样规则
chown -R root test

在这里插入图片描述

四、Linux使用操作

1.创建链接

在Linux中,可以给文件创建链接。链接的意思可以理解是快捷方式,它指向另一个文件或目录。

软链接
软连接(也叫符号链接)是一种特殊类型的文件,它指向另一个文件或目录.

语法

ln -s 原文件路径 符号链接

# 在当前目录下创建一个名为link_to_file的软链接,指向/home/user/file1
ln -s /home/user/file1 link_to_file

在这里插入图片描述

在这里插入图片描述

硬链接
硬链接也是一种链接方式,它允许一个文件有多个名称,但是它们都指向文件系统中同一个数据块(类似于文件地址)
**如果原始文件被删除了,硬链接仍然可以继续使用,**因为它们仍然指向同一组数据块。

语法

ln 原文件路径 符号链接

# 当前目录下创建一个名为hard_link_to_file的硬链接,指向/home/user/file1
ln /home/user/file1 hard_link_to_file

在这里插入图片描述

2.管理服务 systemctl

Linux系统很多软件(内置或第三方)均支持使用systemctl命令控制:启动、停止、开机自启
能够被systemctl管理的软件,一般也称之为:服务

语法:

systemctl [操作] 服务名

操作:

  • start 开启服务
  • stop 停止服务
  • status 查看当前服务状态
  • enable 开启开机自启动
  • disable 关闭开机自启动
    在这里插入图片描述

系统内置的服务比较多,比如:

  • NetworkManager,主网络服务
  • network,副网络服务
  • firewalld,防火墙服务
  • sshd,ssh服务

查看可以使用的服务

ls /usr/lib/systemd/system/

3.日期与时区

date命令
通过date命令可以在命令行中查看系统的时间

语法

date [选项] [+格式化字符串]

选项
" -d "按照给定的字符串显示日期,一般用于日期计算
格式化字符串:通过特定的字符串标记,来控制显示的日期格式

  • %Y 年
  • %y 年份后两位数字 (00…99)
  • %m 月份 (01…12)
  • %d 日 (01…31)
  • %H 小时 (00…23)
  • %M 分钟 (00…59)
  • %S 秒 (00…60)
  • %s 自 1970-01-01 00:00:00 UTC 到现在的秒数

举例

# 查看当前时间
date
# 按照指定格式显示日期
date "+%Y-%m-%d %H:%M:%S"
# 日期的加减 year month day hour minute second
date -d "+1 day" "+%Y-%m-%d"
date -d "-1 day" "+%Y-%m-%d"
date -d "+1 month" "+%Y-%m-%d"
date -d "+1 year" "+%Y-%m-%d"

修改Linux时区
时间在不同时区,是不同的,因此有时,可能因为时区不同,导致时间显示不符合心意,因此需要修改时区,要有root管理员的权限
方法:
将系统自带的localtime文件删除,并将**/usr/share/zoneinfo/Asia/Shanghai**文件链接为localtime文件即可
在这里插入图片描述

rm -f /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

查看当前硬件时间
注意:hwclock 所有命令需要使用root 权限
在这里插入图片描述
将系统时间同步到硬件时间

hwclock -w

将硬件时间同步到系统时间

hwclock -s

4.IP地址与主机机名

IP地址
IP地址主要有2个版本,V4版本和V6版本(V6很少用)
IPv4版本的地址格式是:a.b.c.d,其中abcd表示0~255的数字,如192.168.66.101就是一个标准的IP地址
可以通过命令:ip addr 查看本机的ip地址
特殊IP地址
除了标准的IP地址以外,还有几个特殊的IP地址:

  • 127.0.0.1,这个IP地址用于指代本机
  • 0.0.0.0,特殊IP地址
    • 可以用于指代本机
    • 可以在端口绑定中用来确定绑定关系
    • 在一些IP地址限制中,表示所有IP的意思,如放行规则设置为0.0.0.0,表示允许任意IP访问

主机名
每一台电脑除了对外联络地址(IP地址)以外,也可以有一个名字,称之为主机名
无论是Windows、Mac、Linux系统,都可以给系统设置主机名

修改主机名
通过命令

hostnamectl set-hostname 新的主机名

通过修改文件

vim /etc/hostname

有时即使设置了,也不是自己设置的名字,原因有2种:

  • 设置好没有重启
  • Linux在初始化系统时,会先判断主机名,如果主机名是localhost或localhost.localdomain,则会获取主机IP地址并执行DNS逆向解析,将解析到的结果赋值给HOSTNAME
    解决方案
#修改/etc/hosts文件,追加内容
# ip 主机名
192.168.66.101 myname
#修改/etc/sysconfig/network文件中HOSTNAME的值
NETWORKING=yes
HOSTNAME=myname
#重启服务器

在这里插入图片描述
在这里插入图片描述

5.固定IP地址

找到可以使用的IP地址范围

在这里插入图片描述

设置IP

编辑/etc/sysconfig/network-scripts/ifcfg-ens33文件,修改关键内容为:
BOOTPROTO=“static”
IPADDR=“192.168.247.129”
NETMASK=“255.255.255.0”
GATEWAY=“192.168.247.2”
DNS1=“192.168.247.2”

重启网卡服务即可

systemctl restart network

注意:进入的编辑的文件根据网卡的名字变动:
在这里插入图片描述
在这里插入图片描述
NAT模式的原理
在这里插入图片描述

6.进程的管理 ps

程序运行在计算机操作系统中,由操作系统进行管理。为了管理正在运行的程序,每个程序在运行时都被注册到操作系统中,形成进程。
每个进程都有一个独特的进程ID(进程号),用来区别不同的进程。进程ID通常是唯一的,而且在同一时间内不会被其他进程使用。当操作系统需要对某个进程进行操作时,可以通过进程ID来定位到该进程,并进行相应的管理和控制。
操作系统通过监控进程的运行状态,保证各个进程能够共享CPU、内存等资源,实现多任务的并发执行,提高计算机的效率和利用率。同时,操作系统还可以通过调度算法来控制进程的执行顺序,保证系统的稳定性和可靠性。
语法

ps [options] [–help]

参数:
ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义

  • -A 列出所有的进程
  • -w 显示加宽可以显示较多的资讯
  • -au 显示较详细的资讯
  • -aux 显示所有包含其他使用者的进程
    在这里插入图片描述
    内容信息
    在这里插入图片描述
    查找制定进程
    因为列的数据太多,因此需要筛选数据,这时就可以使用 管道与grep来进行过滤

ps -aux |grep python
因为是字符串数据过滤,所以任何数据都可以用来过滤

关闭进程
在Linux中,可以通过kill命令关闭进程

kill -9 进程ID
-9,表示强制关闭进程

7.端口的查看 netstat

在Linux系统中,端口号是一个16位的整数,取值范围是0~65535

  • 公认端口:1~1023,通常用于一些系统内置或知名程序的预留使用
    • 如SSH服务的22端口,
    • HTTPS服务的443端口
    • 非特殊需要,不要占用这个范围的端口
  • 注册端口:1024~49151,通常可以随意使用,用于松散的绑定一些程序\服务
  • 动态端口:49152~65535,通常不会固定绑定程序,而是当程序对外进行网络链接时,用于临时使用

如果要使用某个服务,需要先打开相应的端口:

netstat [选项]

参数说明:
-a或–all 显示所有连线中的Socket。
-A<网络类型>或–<网络类型> 列出该网络类型连线中的相关地址。
-c或–continuous 持续列出网络状态。
-C或–cache 显示路由器配置的快取信息。
-e或–extend 显示网络其他相关信息。
-F或–fib 显示路由缓存。
-g或–groups 显示多重广播功能群组组员名单。
-h或–help 在线帮助。
-i或–interfaces 显示网络界面信息表单。
-l或–listening 显示监控中的服务器的Socket。
-M或–masquerade 显示伪装的网络连线。
-n或–numeric 直接使用IP地址,而不通过域名服务器。
-N或–netlink或–symbolic 显示网络硬件外围设备的符号连接名称。
-o或–timers 显示计时器。
-p或–programs 显示正在使用Socket的程序识别码和程序名称。
-r或–route 显示Routing Table。
-s或–statistics 显示网络工作信息统计表。
-t或–tcp 显示TCP传输协议的连线状况。
-u或–udp 显示UDP传输协议的连线状况。
-v或–verbose 显示指令执行过程。
-V或–version 显示版本信息。
-w或–raw 显示RAW传输协议的连线状况。
-x或–unix 此参数的效果和指定"-A unix"参数相同。
–ip或–inet 此参数的效果和指定"-A inet"参数相同。

如果不能使用,可以先安装下命令:

yum -y install net-tools

如果想要快速找到数据,可以结合管道与grep筛选

netstat -nptl | grep 端口号
在这里插入图片描述

安装时出现报错:

Error downloading packages:   net-tools-2.0-0.25.20131004git.el7.x86_64: [Errno 256] No more mirrors to try.
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"
 One of the configured repositories failed (未知),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:
     1. Contact the upstream for the repository and get them to fix the problem.
     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).
     3. Run the command with the repository temporarily disabled
            yum --disablerepo=<repoid> ...
     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:
            yum-config-manager --disable <repoid>
        or
            subscription-manager repos --disable=<repoid>
     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:
            yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true
Cannot find a valid baseurl for repo: base/7/x86_64

发现ping网络不可达:
在这里插入图片描述
将电脑网卡改成自动获取(192.168.198.1)后可以正常下载,但是moba却连接不上去:
在这里插入图片描述在这里插入图片描述

查看虚拟机出现一个网卡有两个ip地址可能冲突了:
在这里插入图片描述
用命令删除后观察看下:
在这里插入图片描述

8.查看系统资源使用情况 top

在Linux中,为了更好的管理系统,需要可以了解服务器运行状态,可以通过top命令查看CPU、内存使用情况,类似Windows的任务管理器,默认每5秒刷新一次,语法:直接输入top即可,按q或ctrl + c退出。
在这里插入图片描述
参数说明:
d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称
S : 累积模式,会将己完成或消失的子进程 ( dead child process ) 的 CPU time 累积起来
s : 安全模式,将交谈式指令取消, 避免潜在的危机
i : 不显示任何闲置 (idle) 或无用 (zombie) 的进程
n : 更新的次数,完成后将会退出 top
b : 批次档模式,搭配 “n” 参数一起使用,可以用来将 top 的结果输出到档案内

系统状态
在这里插入图片描述
在这里插入图片描述
top给出的系统运行时间,反应了当前系统存活多久,对于某些应用而言,
系统需要保证7*24小时的高可用性,这个字段信息就能很好的衡量系统的高可用性。

Task 进程状态
在这里插入图片描述
所有启动的进程数、正在运行的进程数、挂起的进程数、停止的进程数、僵尸进程数
提示
在linux操作系统中,一般有以下5种状态的进程信息:

  • D:不可中断睡眠态(通常出现在IO阻塞)
  • R:运行态
  • S:睡眠态
  • T:已停止
  • z:僵尸态

CPU 状态
在这里插入图片描述
在这里插入图片描述
Mem内存信息(物理内存)
在这里插入图片描述
物理内存总量、空闲物理内存、已经使用的物理内存、内核缓存内存量
说明
buffer和cache的作用是所用I/O系统调用的时间,比如读写等;
一般一个系统而言,如果cache的值很大,说明cache住的文件多;
如果频繁访问文件都能被命中,很明显会比读取磁盘调用快,磁盘的IO必定会减小;
提示
cache的命中率很关键,如果频繁访问的文件不能被命中,对于cache而言是个比较的大的资源浪费;
此时应考虑drop cache并提升对应的cache的命中率。

Swap交换内存(虚拟内存)
在这里插入图片描述
交换区总量、空闲交换区总量、已使用交互区总量、缓冲的交换区总量

进程信息
在这里插入图片描述
在这里插入图片描述

9.查看磁盘使用情况 df

Linux df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。

df [选项]…
-a, --all 包含所有的具有 0 Blocks 的文件系统
–block-size={SIZE} 使用 {SIZE} 大小的 Blocks
-h, --human-readable 使用人类可读的格式(预设值是不加这个选项的…)
-H, --si 很像 -h, 但是用 1000 为单位而不是用 1024
-i, --inodes 列出 inode 资讯,不列出已使用 block
-k, --kilobytes 就像是 --block-size=1024
-l, --local 限制列出的文件结构
-m, --megabytes 就像 --block-size=1048576
–no-sync 取得资讯前不 sync (预设值)
-P, --portability 使用 POSIX 输出格式
–sync 在取得资讯前 sync
-t, --type=TYPE 限制列出文件系统的 TYPE
-T, --print-type 显示文件系统的形式
-x, --exclude-type=TYPE 限制列出文件系统不要显示 TYPE
-v (忽略)
–help 显示这个帮手并且离开
–version 输出版本资讯并且离开

# 显示文件系统的磁盘使用情况统计
df
# 显示所有的信息,包含一个额外的行,汇总的每一列
df --total
# 显示文件系统的磁盘使用情况统计,加上单位
df -h

在这里插入图片描述

10.环境变量的使用

环境变量是一种在操作系统(Windows、Mac、Linux)中存储的特殊字符串值,它们可以用于配置操作系统和应用程序的行为。Linux系统中有许多环境变量,包括PATH、HOME、LANG等。环境变量是一种KeyValue型结构。在Linux中,可以通过env命令查看当前系统中记录的环境变量。

环境变量:PATH
在Linux系统中,环境变量PATH是一个非常重要的变量。它是由一组用冒号(:)隔开的路径组成的字符串,这些路径告诉操作系统去哪里查找可执行文件
当我们在终端输入一个命令时,Linux会按照PATH变量中指定的路径顺序依次查找,直到找到对应的可执行文件为止。如果最终没有找到对应的可执行文件,就会提示“command not found”的错误信息

修改环境变量方式
在Linux中,设置环境变量的方式有多种,下面列举了2种常见的设置环境变量的方式:

  • 直接使用export命令设置环境变量

    export MY_VAR=my_value
    在这里插入图片描述

此方法设置的环境变量只会在当前终端窗口中生效,关闭后失效

  • /.bashrc或/.bash_profile文件中添加环境变量
    例如,在~/.bashrc文件末尾添加以下内容:

    MY_VAR=my_value

此方法设置的环境变量会在每次启动bash时自动加载,并对所有子进程可见

.bashrc与.bash_profile都是Bash shell的配置文件,它们位于用户主目录下,区别在于:
.bashrc 当用户打开一个新的终端窗口时,Bash shell就会读取并执行这些命令。通常,在.bashrc文件中设置一些环境变量、别名、函数等
.bash_profile只会在用户首次登录系统时被读取和执行一次。通常,.bash_profile文件用来设置一些与用户账户相关的环境变量和别名等信息
配置环境变量,通过source 配置文件,进行立刻生效,或者重新开启shell窗口。
在这里插入图片描述

11.网络请求 ping命令的使用

ping命令用于测试主机之间的网络连接,可以用于检测网络连接是否正常,路由是否被正确配置,主机是否正在运行等。

ping <选项> <主机名或IP地址>
常用选项说明:
-c <次数>:设置ping的次数,默认是无限制的
-i <间隔秒数>:设置ping的间隔时间,默认是1秒
-t:一直ping,直到Ctrl+C停止
-w <超时秒数>:设置ping的超时时间,默认是无限制的
-q:静音模式,只输出最终的统计信息
-v:详细输出模式,会输出来回的ICMP包信息
-n:使用IP地址而不是主机名
-4或-6:强制使用IPv4或IPv6

# ping www.baidu.com 5次
ping -c 5 www.baidu.com
# 每3秒ping一次ip地址 
ping -i 3 -n 192.168.0.1
# 一直ping,通过Ctrl+C停止
ping -t www.bing.com
# 设置ping超时时间为5秒 
ping -w 5 192.168.0.1

注意
有部分服务器,已经停止了ping服务。
所以ping不通,不一定服务器不通,可以使用其它命令再测试

13.网络请求 下载数据wget与curl

wget
wget是一个强大的命令行下载工具,可以非交互式地从web服务器上下载文件。它支持HTTP、HTTPS和FTP协议,可以使用代理,支持断点续传等功能。
wget命令用于在Linux中通过网络下载文件

安装

yum -y install wget

它的基本语法如下:

wget [选项]… [URL]…
常用选项说明:
-b:后台下载模式
-c:继续之前的下载任务
-q:安静模式,不打印进度条等信息
-O <文件>:将下载的数据写入指定的文件中
-t <次数>:设置重试次数,默认是20
-w <秒数>:设置两次尝试之间等待的秒数,默认是0秒
-nv:不详细显示下载进度
-np:不检查/$HOME/.netrc认证
-r:递归下载整个网站
-l <级数>:指定递归下载的级数,默认是5层
-A <后缀>:只下载指定后缀的文件
-R <后缀>:排除下载指定后缀的文件
-nd:不创建父目录
-x:不创建父目录例子:

# 下载文件并命名为test.txt
wget -O test.txt https://www.baidu.com 
# 后台下载文件 
wget -b https://linux.org/ftp/linux/kernel/v1.0/linux-1.0.tar.gz
注意
无论下载是否完成,都会生成要下载的文件,如果下载未完成,请及时清理未完成的不可用文件。

在这里插入图片描述

curl
在Linux中,curl是一个功能强大的命令行工具,可以下载/上传数据,支持多种协议(HTTP、FTP、POP3等)。
它常被用来测试网站接口、下载文件等

它的基本语法如下:

curl [选项] [URL]
常用选项说明:
-d/–data :POST方式传送数据
-o/–output :将输出写到文件中

# 使用指定的User-Agent字符串
curl -A 'Mozilla/5.0' https://www.example.com 

# 保存cookie到文件
curl -c cookies.txt https://www.example.com

# 上传文件
curl -T file.txt https://www.example.com

# 使用代理连接
curl -x http://user:password@proxyserver:8080 https://www.example.com

在这里插入图片描述

14.压缩与解压 tar命令

压缩格式

  • zip格式:Linux、Windows、MacOS常用
  • rar:Windows系统常用
  • 7zip:Windows系统常用
  • tar:Linux、MacOS常用
  • gzip:Linux、MacOS常用

tar命令介绍
Linux和Mac系统常用有2种压缩格式,后缀名分别是:

  • .tar,称之为tarball,归档文件,仅将文件封装成一个.tar文件,未压缩文件体积
  • .gz,也常见为.tar.gz,使用gzip算法进行压缩,从而大幅减小压缩后的文件体积

针对这两种格式,使用tar命令均可以进行压缩和解压缩的操作

语法

tar [选项] [压缩文件] [被压缩的文件1,被压缩的文件2,被压缩的文件3…]
选项
-c,创建压缩文件,用于压缩模式
-v,显示压缩、解压过程,用于查看进度
-x,解压模式
-f,要创建的文件,或要解压的文件
-z,gzip模式,不使用-z就是普通的tarball格式
-C,选择解压的目的地,用于解压模式
注意
-f,必须在选项组合体的最后一位
-z,建议在开头位置
-C,选项单独使用,和解压所需的其它参数分开

tar 命令压缩

# 将1.txt 2.txt 3.txt 压缩到test.tar文件内
tar -cvf test.tar 1.txt 2.txt 3.txt
# 将1.txt 2.txt 3.txt 压缩到test.tar.gz文件内,使用gzip模式
tar -zcvf test.tar.gz 1.txt 2.txt 3.txt

在这里插入图片描述

tar 命令解压缩

# 解压test.tar,将文件解压至当前目录
tar -xvf test.tar
# 解压test.tar,将文件解压至当前目录
tar -xvf test.tar -C /home/bz
# 以Gzip模式解压test.tar.gz,将文件解压至指定目录
tar -zxvf test.tar -C /home/bz

在这里插入图片描述

15.压缩命令zip与unzip的使用

zip命令
在Linux中,可以使用zip命令,压缩文件为zip压缩包

语法
zip [选项] [压缩的文件名] [被压缩的文件1,被压缩的文件2,被压缩的文件3…]
选项
-r,递归压缩

# 将a.txt b.txt c.txt 压缩到test.zip文件内
zip test.zip a.txt b.txt c.txt
# 将test文件夹和a.txt文件,压缩到test.zip文件内
zip -r test.zip test a.txt

在这里插入图片描述

安装

yum -y install zip

unzip命令
在Linux中,可以使用unzip命令,压缩文件为zip压缩包

语法:unzip [选项] [压缩的文件名]
选项
-d,指定要解压到哪个位置

# 将test.zip解压到当前目录
unzip test.zip
# 将test.zip解压到指定文件夹内
unzip test.zip -d /opt

在这里插入图片描述

安装

yum -y install unzip

16.Linux中软件安装

操作系统安装软件有许多种方式,一般分为:
下载安装包
rpm(Red Hat/Centos)、deb(Debian/Ubuntu)、源码编译安装

应用商店
Linux操作系统中有许多软件应用商店:

  • Ubuntu软件中心(有界面)
  • Deepin 应用商店(有界面)
  • yum命令 软件包管理器(Centos、Fedora、RedHat)
  • apt-get命令 软件包管理器(Ubuntu、Debian)

17.yum软件包管理器

Yum(全称为 Yellowdog Updater, Modified)是一个在Fedora和Red Hat Enterprise Linux等Linux发行版中,以自动化的方式管理软件包的一款工具。
它可以下载、安装、升级和删除RPM软件包,并自动处理依赖关系。

注意
yum命令需要root权限,可以su切换到root,或使用sudo提权
yum命令需要联网

语法

yum [选项] [操作] [软件名]
选项:
-y,自动确认,无需手动确认安装或卸载过程
操作:
search 搜索安装列表中,有没有需要的安装包
install 安装rpm软件包
remove 卸载
update 更新
check-update 检查是否有可用的更新rpm软件包
list 列出系统中已经安装的和可以安装的包

# 列出系统中已经安装的和可以安装的包
yum list 
# yum search在yum源搜索指定的包
yum search wget
# 安装wget
yum -y install wget
# 卸载wget
yum -y remove wget

apt 或者 apt-get 在 Ubuntu系统用于安装软件
使用方式与yum命令只差一个单词的区别,别的都一样

Yum切换数据源
数据源
Yum数据源是指yum软件包管理器用于查找可安装软件包的服务器仓库,在Linux系统中,默认情况下已经配置了一些官方的Yum数据源,可以直接使用,但是,由于网络状况、服务器负载等原因,有时候我们需要切换到其他的Yum数据源进行软件包的下载和安装。
可选的数据源

  • 清华大学开源软件镜像站 https://mirror.tuna.tsinghua.edu.cn/help/centos/
  • CentOS镜像使用帮助 (163.com) https://mirrors.163.com/.help/centos.html
  • 阿里云镜像
    https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b11JLb1zR

涉及的命令

yum [操作]
repolist 查看yum源
clean all 清除yum的所有缓存
makecache 生成新的缓存

在这里插入图片描述

18.安装软件 编译方式介绍

在Linux中编译安装软件通常需要执行以下几个步骤:

  • 下载源代码包
    • 可以从软件的官网、github等网下载
  • 解压源代码包
  • 进入软件包源代码目录
    • 在解压后得到的目录中,通常会有一个README文件、INSTALL、SETUP文件,其中描述了如何编译和安装软件
  • 执行configure脚本
    • 大多数软件包都包含了一个configure脚本,用于检测系统环境,并生成Makefile文件,Makefile文件包含了编译和安装软件所需的所有信息,执行./configure命令即可
  • 执行make命令
    • make命令将根据Makefile文件中的指示开始编译软件,这些指示告诉系统如何将源代码转换为可运行的软件
  • 执行make install命令
    • 这个命令将按照Makefile文件中指定的位置将已编译好的二进制文件、库文件、文档等安装到系统中

注意
一些软件可能会要求,安装一些依赖库或开发工具,以便能够成功编译软件包
往往需要安装的软件,gcc、zlib

yum -y install gcc

19.安装软件 openssl

OpenSSL是一个开源的软件库,实现了安全套接字层 (SSL) 和传输层安全 (TLS) 协议
它是用 C 语言编写的,并在多个操作系统和平台上运行
OpenSSL 提供了一个广泛的功能集,包括:

  • SSL/TLS 安全协议支持:OpenSSL 可以为客户端和服务器提供 SSL/TLS 安全通信。
  • SSL/TLS 是一种通过加密和认证保护数据通信安全的标准协议
  • 密码学支持:OpenSSL 实现了许多密码学算法,包括对称加密、非对称加密、哈希函数等,可以用于数据加密、数字签名和其他安全应用
  • 证书管理:OpenSSL 可以生成和管理数字证书,这些证书可用于 SSL/TLS 通信和身份验证 X.509 证书认证机构 (CA)功能:OpenSSL 集成了 CA 功能,可以创建自己的证书颁发机构并颁发数字证书
  • 远程命令执行:OpenSSL 可以在不同计算机之间建立安全连接,并使用 SSL/TLS 加密和认证执行远程命令
  • 应用程序接口(API)和工具:OpenSSL 提供了 API,使应用程序能够使用 SSL/TLS
    和其他安全通信功能。该库还包含一些命令行工具,可用于测试和诊断 SSL/TLS 连接以及执行其他安全任务
    总之,OpenSSL 是一个多功能、灵活且广泛使用的软件库

下载源代码包
网站地址:https://www.openssl.org/source/
下载地址:https://www.openssl.org/source/openssl-1.1.1t.tar.gz

解压源代码包
tar -xzvf openssl-1.1.1t.tar.gz
进入软件包源代码目录
cd openssl-1.1.1t
执行configure脚本
./config
在这里插入图片描述
执行make install命令
make && make install
配置链接
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
注意
因为要编译软件,并且是C语言编写的,因此需要gcc模块,

安装方式:

yum -y install gcc

检查安装是否成功

openssl version
在这里插入图片描述

20.Python安装

下载源代码包
地址:https://www.python.org/downloads/

# 安装下载文件工具
yum install wget -y
# 下载文件
wget https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tgz

解压源代码包
tar -xvf Python-3.9.4.tgz

进入软件包源代码目录
cd Python-3.9.4

注意有的时候某些软件安装前需要有必备软件,如python需要有openssl才可以执行
在这里插入图片描述

安装依赖库或开发工具
yum -y install zlib* libffi-devel bzip2-devel xz-devel

执行configure脚本
./configure prefix=/usr/local/python3 --enable-optimizations
#目的是为了编译

执行make install命令
make install

配置环境变量

# 修改环境变量文件
vim ~/.bash_profile
# 将python的路径,增加PATH中
PATH=$PATH:/usr/local/python3/bin/
# 执行文件
. ~/.bash_profile

检查安装是否成功
python3 -V

21.MySQL安装和配置

更新yum源
https://mirror.tuna.tsinghua.edu.cn/help/mysql/
新建 /etc/yum.repos.d/mysql-community.repo,内容如下:

[mysql-connectors-community]
name=MySQL Connectors Community
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-connectors-community-el7-$basearch/
enabled=1
gpgcheck=1
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql

[mysql-tools-community]
name=MySQL Tools Community
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-tools-community-el7-$basearch/
enabled=1
gpgcheck=1
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql

[mysql-5.7-community]
name=MySQL 5.7 Community Server
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-$basearch/
enabled=1
gpgcheck=1
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql

安装数据库

yum -y install mysql-community-server

提示如下错误:

Failing package is: mysql-community-libs-compat-5.7.37-1.el7.x86_64 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
原因是:GPG对于包的源key的验证没有通过

解决方案
使用如下命令安装:

yum -y install mysql-community-server --nogpgcheck
在这里插入图片描述

启动MySQL服务

systemctl start mysqld
在这里插入图片描述

找到登录的临时密码
此时MySQL已经开始正常运行,不过要想进入MySQL还得先找出此时root用户的密码,通过如下命令可以在日志文件中找出密码:

cat /var/log/mysqld.log | grep password 
[root@nodel1 ~]# cat /var/log/mysqld.log | grep password 
2023-11-02T16:56:50.866960Z 1 [Note] A temporary password is generated for root@localhost: tIjpUQy_x6Ms

复制粘贴上边的密码进入数据库

mysql -uroot -p

注意:
输入初始密码,登录进去后,此时不能做任何事情
因为MySQL默认必须修改密码之后才能操作

修改密码

ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘123456’;

提示如下错误:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
原因是:密码太简单,不允许
解决方案:修改密码策略,因为密码太复杂不方便后期做实验

修改密码策略
使用命令修改密码策略两种方式:

mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password_policy=LOW;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL validate_password_length=6;
Query OK, 0 rows affected (0.00 sec)
注:执行完初始化命令后需要输入数据库root用户密码
注:密码策略分四种
1、OFF(关闭) 2、LOW(低) 3、MEDIUM(中) 4、STRONG(强)

修改密码

ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘123456’;

此处修改密码为root/1QAZ2wsx…
在这里插入图片描述

开启远程连接

use mysql;
update user set host ="%" where user = "root";
# 刷新信息
flush privileges;

在这里插入图片描述

五、ShellScript脚本编程

1.Shell介绍

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
在这里插入图片描述
Shell的分类
在linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是/bash/shell( 重 点\默认 ),流行的还有/bin/sh、/bin/bash、/usr/bin/sh、/usr/bin/bash、/bin/tcsh、/bin/csh。

查看流行shell

cat /etc/shells

当前系统使用的Shell

echo $SHELL

在这里插入图片描述

2.入门

文件命名规范
文件名**.sh** 。 .sh是linux下bash shell 的默认后缀

Shell解析器
指定告知系统当前这个脚本要使用的shell解释器

#!/bin/bash

第一个Shell程序“Hello World”

在根目录下创建一个"scripts"文件夹,用来存储文件
mkdir scripts

创建Shell文件
touch hello.sh

编辑Shell文件
#!/bin/bash
echo “Hello World”

执行脚本
bash ./hello.sh
sh ./hello.sh
在这里插入图片描述
更简单的执行方式,因为我们知道当前就在bash下面,所以可以直接执行文件
./hello.sh
此时报错:-bash: ./hello.sh: Permission denied,这是因为没有权限:
ll hello.sh # -rw-r–r–. 1 root root 31 Jun 21 05:41 hello.sh

接下来给予权限
chmod +x hello.sh
此时你会发现,文件变了颜色,所有可执行文件都会变成绿色,执行文件
在这里插入图片描述
扩展执行方案:

source 文件.sh
. 文件.sh

3. Shell变量

3.1 系统预定义变量

运行Shell文件的区别
bash ./hello.sh 和 sh ./hello.sh
source hello.sh 和 . hello.sh

两种运行的方式差异性在于,第一种是在子bash环境下运行,而第二种是在当前bash环境下运行,我们通过运行type source可以看到 source is a shell builtin (source 是 shell 内嵌)
我们执行ps -f可以查看当前bash环境,创建一个子bash,继续通过ps -f查看,在当前子bash环境下,你依然可以运行shell文件
在这里插入图片描述

从结果上来看,两者好像没有什么区别,但是如果引入更多知识,例如变量:如果子shell中设置的当前变量,父shell是可不见的

变量简介
变量本质上其实是在内存中开辟一个空间用来临时存储数据,例如:age = 20
在这里插入图片描述
全局变量和局部变量的区别
在这里插入图片描述
全局变量:层层嵌套的子bash依然可以访问
局部变量:只在当前的bash中可以访问,子bash和父bash都不能访问

常用系统变量

$HOME$PWD$SHELL$USER

查看当前所有的全局系统变量env
查看当前所有的变量set(包含全局和局部的,系统的,用户的)

3.2 用户自定义变量

基本语法:定义变量:变量名=变量值
规则

  • 等号前后不能有空格
  • 在声明变量的时候是不需要添加$符号,但是使用时候需要添加
  • 如果定义的是一个字符串,需要将值添加双引号或者单引号
    在这里插入图片描述
    查看定义的变量是全局还是局部
    全局:env | grep 变量名
    局部:set | grep 变量名
    当然,你可以进入子bash中去尝试输出变量,无法输出则是局部变量,可以输出则是全局变量
    在这里插入图片描述

全局变量
如何定义一个全局变量呢?需要先声明一个局部变量,然后再通过export导出为一个全局变量

export 变量名

在子bash中修改全局变量,只会再当前环境中生效,不会影响父bash环境,哪怕是你增加export也依然不会影响到父bash环境

Shell脚本中使用变量
我们可以在hello.sh的脚本中去调用全局和局部变量

#!/bin/bash
echo $txt

在这里插入图片描述
在shell脚本中使用变量,同样遵循全局和局部变量的规则

3.3 只读变量和撤销变量

自定义变量注意事项:

  • 变量命名规范:字母、数字和下划线组成,其中数字不能开头
  • 自定义变量一般都是小写的
  • 在shell中,变量是没有类型的,或者我们理解为全部都是字符串类型
  • 如果变量的值需要做数值运算,可以使用 ( ( 1 + 1 ) ) 或者 ((1+1))或者 ((1+1))或者[1+1]的形式
    在这里插入图片描述

只读变量
在shell中,只读变量相当于是常量,定义之后不允许修改。定义规则

readonly 变量名=值

撤销变量
变量定义之后是可以撤销的,使用unset 变量名就可以撤销了

变量是可以撤销的,但是只读变量是不可以撤销的

3.4 特殊变量

在Shell中,存在一些特殊变量,他们具有特殊的意义

$n
$n代表接受参数,n是数字,代表在执行脚本时候传递的参数数量,例如$1- 9 代表第一个到第九个参数,十以上的数字,可以使用大括号包裹,例如 9代表第一个到第九个参数,十以上的数字,可以使用大括号包裹,例如 9代表第一个到第九个参数,十以上的数字,可以使用大括号包裹,例如{10}。比较特殊的是$0,代表当前脚本名称

#!/bin/bash
echo '======$n====='
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo $0

在这里插入图片描述

$#
$#获取输入参数的个数,一般用于循环中,判断参数的个数是否正确,加强脚本的健壮性

#!/bin/bash
echo '=====$#====='
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo $#

在这里插入图片描述

∗ 和 *和 @
∗ 和 *和 @非常相似,都代表命令行所有的参数,但是 ∗ 把参数看成是一个整体,例如 123456 。而 *把参数看成是一个整体,例如123 456。而 把参数看成是一个整体,例如123456。而@把每个参数区分对待,例如[123,456] 注意:在没有循环遍历时候,两者效果一致

#!/bin/bash
echo '=====$n====='
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo '=====$*====='
echo $*
echo '=====$@====='
echo $@

在这里插入图片描述

$?
$?最后一次执行命令的状态,如果是结果是0,证明上面执行的命令都是正确的,如果结果不是0(具体是哪个数字,有命令自己决定),则证明上面命令不正确了

[root@localhost scripts]# vim hello.sh
[root@localhost scripts]# echo $?
0
[root@localhost scripts]# hello.sh
-bash: hello.sh: command not found
[root@localhost scripts]# echo $?
127
[root@localhost scripts]# 

4.运算符

在Shell中,还存在expr表达式,可以用于做运算

在Shell中,运算需要使用$((a+b))或者$[a+b]的形式

表达式 expr

expr 10 + 10
expr 10 - 10
expr 10 \* 10

运算符前后要添加空格
在这里插入图片描述
如何要赋值给一个变量,需要命令替换

a=$(expr 10 + 10)
a=`expr 10 + 10`

在这里插入图片描述

$((a+b))或者$[a+b]

$((10+10))
$[10+10]

在这里插入图片描述
实例:计算 (5+4) * 10 的值

s=$[(5+5)*10]

脚本中操作
创建add.sh,在执行的时候,通过传递参数的形式实现加法效果

#!/bin/bash
sum=$[$1 + $2]
echo sum=$sum

5.条件判断

基本语法

test 表达式
[ 表达式 ] 注意:中括号前后需要有空格

[root@localhost scripts]# a=10
[root@localhost scripts]# echo $a
10
[root@localhost scripts]# test $a = 10
[root@localhost scripts]# echo $?
0
[root@localhost scripts]# test $a = 11
[root@localhost scripts]# echo $?
1
[root@localhost scripts]# [ $a = 10 ]
[root@localhost scripts]# echo $?
0
[root@localhost scripts]# [ $a = 11 ]
[root@localhost scripts]# echo $?
1
[root@localhost scripts]# [ $a=11 ]
[root@localhost scripts]# echo $?
0
[root@localhost scripts]# [ ]
[root@localhost scripts]# echo $?
1
[root@localhost scripts]# [ $a != 11 ]
[root@localhost scripts]# echo $?
0
[root@localhost scripts]# echo $a
10
在这里插入图片描述

两个值比较
在这里插入图片描述
在这里插入图片描述

文件权限判断

  • -r 有读的权限(read)
  • -w 有写的权限(write)
  • -x 有执行的权限(execute)
    在这里插入图片描述

文件类型判断

  • -e 文件存在(existence)
  • -f 文件存在并且是一个文件类型(file)
  • -d 文件存在并且是一个目录类型(directory)
    在这里插入图片描述

多条件判断

  • && 与的关系,两者都成立
  • || 或的关系,两者有一个成立

&& 表示前一个条命令执行成功之后,在执行第二个条件
|| 表示前一个条命令执行失败之后,再执行第二个条件
由此,我们可以衍生出来,类似三元运算符的形式
示例 [ $a -eq $b ] && echo “$a=$b” || echo “$a!=$b”
在这里插入图片描述

6.流程控制

if判断
基本语法

if [ 条件判断 ]; then
语句
fi
if [ 条件判断 ]
then
语句
fi

在这里插入图片描述

示例

if [ $a = 10 ];then echo 'OK'; fi

#!/bin/bash
if [ $a = 10]
then 
    echo "ok"
fi
if [ $a = 10 -a $b = 10 ];then echo "ok";fi

在这里插入图片描述
在这里插入图片描述

if [ 条件判断 ]
then
语句
else
语句
fi

#!/bin/bash
if [ $1 -lt 18 ]
then
    echo "未成年"
else
    echo "成年人"
fi

在这里插入图片描述
在这里插入图片描述

if [ 条件判断 ]
then
语句
elif [ 条件判断 ]
then
语句
else
语句
fi

#!/bin/bash
if [ $1 -lt 18 ]
then
    echo "未成年"
elif [ $1 -lt 35 ]
then
    echo "青年人"
elif [ $1 -lt 60 ]
then
    echo "壮年人"
else
    echo "老年人"
fi

在这里插入图片描述
在这里插入图片描述
case语句
if 如果遇到多个条件,写起来会很麻烦,可以使用 case 改写

case $变量名 in
“值1”)
语句
;;
“值2”)
语句
;;
…省略其他分支…
*)
语句
;;
esac

注意事项

  • case行结尾必须为单词"in",每一个模式匹配必须以右括号")"结束
  • 双分号 “;;” 表示命令序列结束,相当于跳出当前判断语句
  • 最后 “*)” 表示默认模式结尾,不符合最终的出口
#!/bin/bash
case $1 in
1)
    echo "值为1"
;;
2)
    echo "值为2"
;;
3)
    echo "值为3"
;;
*)
    echo "其他数字"
;;
esac

在这里插入图片描述
在这里插入图片描述
for循环
循环语句用于重复执行某个操作。
for语句就是循环命令,可以指定循环的起点、终点和终止条件。
基本语法1

for (( 初始值; 循环控制条件; 变量变化))
do
语句
done

#!/bin/bash
for (( i=0;i<=100;i++ ))
do
    sum=$[$sum+$i]
done
echo $sum

在这里插入图片描述
在这里插入图片描述

基本语法2

for 变量 in 值1 值2 值3…
do
语句
done

#!/bin/bash
for os in linux windows macos
do
    echo $os
done

在这里插入图片描述
在这里插入图片描述

内部运算符
在shell中,{}是内部运算符,{}表示一个序列,例如,从1写到100: {1…100}

#!/bin/bash

for i in {1…100}
do
sum= [ [ [sum+$i]
done
echo $sum

在这里插入图片描述
在这里插入图片描述

$*和$@
$*和$@非常相似,都代表命令行所有的参数,但是$*把参数看成是一个整体,例如123 456。而$@把每个参数区分对待,例如换行显示。 在没有循环遍历时候,两者效果一致

#!/bin/bash
echo '=====$*====='
for param in "$*"
do
    echo $param
done
echo '=====$@====='
for param in "$@"
do
    echo $param
done

在这里插入图片描述
while循环

while [ 条件判断 ]
do
语句
done

#!/bin/bash
a=1
while [ $a -le $1 ]
do
    sum=$[$sum+$a]
    a=$[$a+1]
done
echo $sum

#!/bin/bash
a=1
while [ $a -le $1 ]
do
#    sum=$[$sum+$a]
#    a=$[$a+1]
     let sum+=a
     let a++
done
echo $sum

7.读取控制台输入

基本语法

read 选项 参数

选项:
-p:指定读取值时候的提示符
-t:指定读取值时候的等待时间(秒) 如果不添加 -t 表示一直等待
参数:
变量:指定读取值的变量名

read -t 10 -p "请输入您的名字:" name
echo "welcome,$name"

在这里插入图片描述

8.系统函数

函数的本质就是一段可以反复调用的代码块
在Shell中,函数细分为系统函数和自定义函数

系统函数
可以测试系统命令,如使用率非常高的 date ,还可以获取时间戳 date +%s
当需要打印写一些系统日志信息文件的时候,文件的命名规则通常在最后会添加上时间戳

#!/bin/bash
filename="$1_log_$(date +%s)"
echo $filename

使用的系统命令(或者系统函数)date +%s要进行命令替换,也就是添加$(date +%s)

basename
basename 的作用是获取文件名称,它会删除所有的前缀包括最后一个"/"字符,然后将字符串显示出来

基本语法

basename [string/pathname][suffix]

suffix为后缀,如果suffix被指定了,basename将会pathname或string中的suffix去掉
可以先拿一个路径或者字符串测试

basename /scripts/cmd_test.sh
basename /scripts/cmd_test.sh .sh
basename /abc/def/cmd_test.sh
/abc/def/cmd_test.sh .sh

在这里插入图片描述

之前的特殊变量$n,其中$0是获取当前名字,但是带有路径,希望只获取名字,所以可以通过basename 去掉路径,甚至去掉后缀:

#!/bin/bash
echo '=====$n====='
echo script name:$0

#!/bin/bash
echo '=====$n====='
echo script name:$(basename $0 .sh)

dirname
dirname获取文件路径的绝对路径,从给定的包含绝对路径的文件名中去除文件名,然后返回剩余的路径

dirname /scripts/cmd_test.sh
dirname /abc/def/cmd_test.sh

可以获取某个文件的绝对路径:

#!/bin/bash
echo '=====$n====='
echo script path:$(cd $(dirname $0); pwd)
echo script name:$(basename $0 .sh)

9.自定义函数

基本语法

function 函数名(){
// 函数体
return 返回值
}
必须在调用函数之前,先声明函数
函数返回值可以通过$?获取,但注意,$?的值范围是0~255
实现一个两个数值相加的函数

#!/bin/bash
function add(){
    s=$[$1 + $2]
    echo "和:"$s
}
read -p "请输入第一个参数:" a
read -p "请输入第二个参数:" b
add $a $b

在这里插入图片描述

但是此时函数是没有返回值的,也就是无法获取函数的执行结果,可以将echo修改为return

#!/bin/bash
function add(){
    s=$[$1 + $2]
     return $s
}
read -p "请输入第一个参数:" a
read -p "请输入第二个参数:" b
add $a $b
echo "和:" $?

此时虽然有了返回值,因为$?的原因,计算结果最大也只能是255,我们可以换一种方式获取函数执行结果

#!/bin/bash
function add(){
    sum=$[$1 + $2]
    echo $sum
}
read -p "请输入第一个参数:" a
read -p "请输入第二个参数:" b
sum=$(add $a $b)
echo "和:" $sum
echo "和的平方:"$[$sum * $sum]

10.案例 归档文件

需求:实现一个目录归档备份的脚本,输入一个目录名称,将目录下所有文件按天归档保存,并将归档日期附加在文档文件名上,放在根目录下(/archive)
用到的归档命令:tar
后面可以加上-c选项表示归档,加上-z选项表示同时进行压缩,得到的文件后缀名为.tar.gz

#!/bin/bash
# 首先判断输入参数个数是否为1
if [ $# -ne 1 ]
then
    echo "参数个数错误!应该输入一个参数作为归档目录名"
    exit
fi
# 从参数中获取目录名称,查看目录名称是否存在
if [ -d $1 ]
then
    echo
else
    echo
    echo "目录不存在!"
    echo
    exit
fi

# 获取绝对路径
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)

# 获取当前日期,归档文件拼接生成日期
DATE=$(date +%y%m%d)

# 定义生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz

# 定义生成归档文件的路径
DEST=/archive/$FILE


# 开始归档目录文件
echo "开始归档..."
echo

# -c 归档 z 压缩 f 可视化
tar -czf $DEST $DIR_PATH/$DIR_NAME


# 判断上面归档文件操作是否成功
if [ $? -eq 0 ]
then
    echo
    echo "归档成功"
    echo "归档的文件为:$DEST"
    echo
else
    echo "归档出现问题!"
    echo
fi

exit

只有当前用户具有之执行权限

chmod u+x daily_archive.sh

11.定时归档文件

将实现目录归档备份的脚本添加定时器,要求每天凌晨2点定时归档
crontab定时器:

f1 f2 f3 f4 f5 command
分 时 日 月 周 命令
第1列表示分钟0~59 每分钟用*或者 */1表示
第2列表示小时0~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

crontab -l
crontab -e
*/1 * * * * date >> /scripts/crontab_test.txt #分钟-小时-日-月-周
crontab -r

12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup
0 6-12/3 * 12 * /usr/bin/backup
周一到周五每天下午 5:00 寄一封信给 alex@domain.name
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
每月每天的午夜 020 分, 220 分, 420 分…执行 echo “haha”
20 0-23/2 * * * echo "haha"

给脚本添加定时器
0 2 * * * /scrtips/daily_archive.sh /scripts

12.正则表达式

正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中,grep,sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配

常规匹配
一串不包含特殊字符的正则表达式匹配它自己

cat /etc/passwd | grep root

常用特殊字符
特殊字符:^;
^匹配一行的开头

cat /etc/passwd | grep ^a

特殊字符:$
$匹配一行的结束

cat /etc/passwd | grep h$

^和$能否一起使用呢?
如果匹配规则只有^$会匹配什么呢?

cat /etc/passwd | grep ^root$
cat /scripts/daily_archive.sh | grep ^$
cat /scripts/daily_archive.sh | grep -n ^$

特殊字符:.
.匹配一个任意字符

cat /etc/passwd | grep r.t
cat /etc/passwd | grep r…t

特殊字符:*
* 不单独使用,他和上一个字符连用,表示匹配上一个字符 0 次或多次

cat /etc/passwd | grep ro*t
cat /etc/passwd | grep r.*t

字符区间(中括号):[]
[] 表示匹配某个范围内的一个字符
[6,8]------匹配6或者8
[0-9]------匹配一个0-9 的数字
[0-9]*------匹配任意长度的数字字符串
[a-z]------匹配一个 a-z 之间的字符
[a-z]*-----匹配任意长度的字母字符串
[a-c,e-f]—匹配 a-c 或者 e-f之间的任意字符

cat /etc/passwd | grep r[a,b]t
echo "23fsdfrat23f5y2t23sdf" | grep r[a,b]t
echo "23fsdfrat23f5y2t23sdf" | grep r[ab]t
echo "23fsdfraabat23f5y2t23sdf" | grep r[ab]*t
cat /etc/passwd | grep r[a-z]t
cat /etc/passwd | grep r[a-z]*t

特殊字符:\
\ 表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如,我想找出所有包含"$"的行),就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身

cat /scripts/daily_archive.sh | grep ‘$’

匹配手机号

echo "14747696666" | grep ^1[345789][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$
echo "14747696666" | grep -E ^1[345789][0-9]{9}$

13. cut

cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每行剪切字节、字符和字段并将这些字节、字符和字段输出。
基本用法

cut [选项参数] filename
说明:默认分隔符是制表符
选项说明
在这里插入图片描述

百 我
战 来
程 学
序 习
员 了
cut -d " " -f 1 cut_test.txt
cut -d " " -f 2,3 cut_test.txt

在这里插入图片描述

cat /etc/passwd | grep bash$
cat /etc/passwd | grep bash$ | cut -d ":" -f 1,7
cat /etc/passwd | grep bash$ | cut -d ":" -f 5-
cat /etc/passwd | grep bash$ | cut -d ":" -f -5
cat /etc/passwd | grep bash$ | cut -d ":" -f 5-7
ifconfig # 获取当前的IP
ifconfig ens33 # 获取ens33的信息
ifconfig ens33 | grep netmask # 获取具有IP的一行
ifconfig ens33 | grep netmask | cut -d " " -f 10 # 切分ens33的IP
ifconfig | grep netmask | cut -d " " -f 10 # 切分所有IP

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值