linux

* Virtualenv 虚拟环境 * nginx * Redis * Docker * dockerfile * rabbitmq * salt * RPC

计算机必须有的组成部分:cpu、硬盘、内存、电源
服务器硬件

  • 显示屏
  • 内置键盘
  • usb接口
  • 触摸板
  • 网口
  • 电源接口
  • 散热口
  • 摄像头
  • 电源开关

服务器硬件厂商

  • dell :戴尔
  • hp :惠普
  • 联想
  • 浪潮
  • ibm

cpu: 人的记忆,如同计算机的内存条,如果进程不重启,服务器不重启,内存中的数据也不丢
内存: 是CPU和磁盘之间的缓冲设备,也叫临时存储器(存放数据),断电时数据丢失

服务器分类:互联网公司,怎么选择服务器?一般有什么

1).物理服务器,有钱的大公司,买自己的服务器,建造自己的机房(零度,无尘,无静电)防止机器短路,数据丢失
有钱的公司,bat,建造自己的机房
中等的公司,普通的外企,也有自己的服务器,但是服务器,托管在别人的机房(世纪互联这家公司)

2).云服务器,阿里云,腾讯云(便宜,省钱,无烦恼),初创型的小公司
3).vmware虚拟化技术

linux

linux 系统的优势:

跨平台的硬件支持; 丰富的软件支持; 多用户多任务; 可靠的安全性 ; 良好的稳定性; 完善的网络功能

shell

我们输入linux命令发给 linux操作系统 ,shell将我们输入的命令,翻译给操作系统去执行

linux的发行版

各个厂家进行自己的定制开发,衍生出不同的发行版
不同的发行版,命令大同小异
centos 社区版的redhat,免费使用,功能和redhat一模一样
ubuntu 作为很多个人学习的linux平台,也常用在物联网嵌入式中
redhat 红帽子,企业版linux,收费使用,redhat资格认证才可以进行linux运维维护,rhcsa红帽管理员,rhce红帽工程师,rhca(红帽架构师)

开源软件特性

低风险 高品质 低成本 更透明

使用linux的好处 :

是自由传播,免费,不会犯法,任意切换图形/命令终端,安全稳定,不用杀毒软件,不卡

Python连接shell的工具是啥

os.system(cmd)
os.popen(cmd)
commands.getoutput(cmd) #python2使用
subprocess.run() #python3使用

例:

data_cmd = 'curl -s http://xxxxx'
result = commnads.getstatusoutput(data_cmd) 
if  retsult[0] == 0"
    print xxx

linux xshell的快捷键

Tab 自动补全
Ctrl + c 取消当前操作
ctrl + l 是清屏
ctrl + d 是退出登录
ctrl + shift + r 是快速重新连接

什么是服务器

(在网络中对外提供服务器的一台性能超强的计算机),硬件
实体服务器
云服务器

centos7版本的linux操作系统

选择的vmware虚拟化软件,安装的linux,充当一个服务器的角色
服务器(可能是云服务器,也可能在全球各地某一个机器),开发人员一般是不会直接触碰的,通过远程连接的方式,去使用

xshell 就是封装了ssh(远程连接的命令),只在windows下有的工具
如果你用的就是linux或者macos,只需要打开终端,输入ssh命令即可


1.linux是个操作系统,服务器的操作系统,centos7系列的发行版
2.windows机器上,安装虚拟化软件vmware,在vmware软件里,安装linux操作系统
3.vmware如同服务器,我们选择远程登录,使用的工具是 xshell

远程登录linux的命令

ssh 用户名@服务器的ip地址(公网的ip)
ssh 用户名@教室内的局域网ip地址(私有的) 确保在同一个网段

windows查看ip的命令 :ipconfig
linux查看ip的方式: ifconfig

linux登录之后的命令提示符
当前你所在的路径
#  超级用户的身份提示符  
$  普通用户的身份提示符 
pip3 instal django   #python装东西 
yum install  tree  #linux安装软件  

linux的特殊符号的含义

    # 注释
    ~   用户家目录
    -   上一次的工作目录
    .当前目录
    ..上一级目录
    ./ 当前工作目录
    > 重定向覆盖输出符号
    w
    模式
    >> 重定向追加输出符号
    a
    追加
    < 重定向输入符,覆盖写入
    << 重定向追加写入符号
    用在mysql数据导入时候
    $PATH
    环境变量

摘出来一些常用的基础命令

su 切换用户
mkdir   创建文件夹
cd   切换目录
touch   创建普通文件
cat  查看文本内容
vim   文本编辑器
ls   查看文件夹内容
ll   等于 ls   -l 
ps -ef   查看linux的进程
top    linux的任务管理器
find  查找linux文件的
grep   过滤字符串信息的
pwd   打印当前工作目录的绝对路径
mv   移动文件 ,重命名
windows和linux传输文件的方法:xftp lrzsz scp
rm  删除文件  rm -rf    -r  递归删除文件夹  -f  强制不提醒就删除
yum   linux安装软件的命令,如同pip
head   从文本前*行开始看,默认前10行
tail  从文本后面10行看      tail  -f  filename   实时监控文件内容
more  翻页显示文件内容
less  翻页显示文件内容
echo  追加内容,相当于print打印
ifup  ifdown 启停网卡的快捷命令
systemctl restart network 通过命令重启网卡
id kun  #查看用户身份id  
sudo 临时提权的命令
userdel -r  用户名 #删除用户信息,和家目录
netstat -tunlp  | grep 8000  确认django的端口是否启动
ps -ef |grep python  确认django的进程是否存在 
kill 进程id   # 杀死进程的命令
Pkill  -9   #杀死全部进程
Hostnamectl  set-hostname  #更改主机名
显示磁盘空间  df -h 
显示系统主机名的命令:  uname -n

查看命令    cat * | grep  卡維薩
systemctl stop firewalld.service 	 #关闭防火墙服务
systemctl disable firewalld.service   #禁止防火墙开机自启
iptables -F  #清空防火墙规则
cat /etc/os-release  #如何查看系统发行版信息
#cat /etc/redhat-release  #查看系统版本信息
/etc/profile  #系统全局环境变量配置文件
userdel -r  用户名 #删除用户信息,和家目录

#查看文件夹的进程
lsof 文件    #显示打开指定文件的所有进程
fuser  对应的文件
fuser  -k   文件    #杀死占用对应文件的全部进程

yum clean all #清空缓存
yum makecache #生成yum缓存

pkill -9 进程号
其他信号说明

查看文件夹大小du -sh

centos6 命令管理服务 :  service  nginx  start 
centos7 命令管理服务: systemctl  start/stop/restart  nginx 

查看内存大小信息

cat /proc/meminfo |grep MemTotal
free -m 

查看cpu

cat /proc/cpuinfo  
Lscpu     top  

查看板卡

Cat pro/pci lspci

查看网卡

cat pro/interrupts

如何手动启动网卡?

Ifup  网卡名
Ifup ens33
Ifup eth0
Systemctl start network 

1.文件夹的操作慢命令

Pwd : 获取当前在哪个文件夹(目录) print work 目录(我在哪的命令)
**ls ** list的意思,查看当前文件夹下有哪些文件夹
man 手册 ,解释linux的命令如何使用
cd 更改工作目录的命令 cd /tmp

语法: mkdir 文件夹名字 (文件夹是蓝色的)

语法: mv命令,旧名字 新名字

mv   一脸懵逼    二脸懵逼 
#新名字存在就是把一脸懵逼移动到二脸懵逼文件下,新名字不存在,就是改名字(后边的斜杠加不加都一样)
mv   二脸懵逼/呵呵/   ./   #这是把呵呵从二脸懵逼文件夹下移到当前文件夹下了

查:

语法: ls 查看文件夹内容

ls  呵呵

linux隐藏文件都是以 . 开头

ls -a  显示文件夹所有内容,以及隐藏文件
ls -la  以列表形式,详细输出文件信息

df 命令

命令选项

  1. -a, --all 显示所有文件系统的磁盘使用情况,比如如下的使用情况

  2. -B,--block-size=SIZE,以size为单位打印磁盘的使用情况,比如:
    以GB为单位打印磁盘使用情况

以MB为单位打印磁盘使用情况:df -BM或 df -B 1048576

  1. -h 以易读的方式打印磁盘的使用情况,与-BM的打印效果相当

  2. -H是以1000为单位显示磁盘使用情况

  3. -k与-BK的打印效果相当,都是指定打印单位为k

  4. -i 显示i节点信息,而不磁盘块的使用信息

  5. -l 只显示本地文件系统的磁盘使用情况,与df不带选项的命令打印效果相同

  6. -T打印文件系统的类型

  7. -t选项后面加一个文件系统类型,只显示特定文件系统的磁盘使用情况

  8. -x选项后面加一个文件系统类型,不显示指定文件系统的磁盘使用情况

  9. -p使用POSIX的输出模式

2.vim编辑器

即文本编辑器

字母 i  ,代表插入,编辑
退出编辑模式,按下esc键
输入 :  冒号,进入底线命令模式 ,输入  :wq!
:  w写入
q  退出   !强制的
:wq!  强制写入文本且退出vim
:q!  不写入直接强制退出
:w!  只保存写入,不退出 

工作模式

命令模式 编辑模式 底线命令模式
vim快速替换

  1. 文件内全部替换:
    :%s#abc#123#g --注:把abc替换成123
    (如文件内有#,可用/替换,:%s/abc/123/g)
    (或者: %s/str1/str2/g 用str2替换文件中所有的str1)

  2. 文件内局部替换:
    :20,30s#abc#123 (注:把20行到30行内abc替换成123)
    (如文件内有#,可用/替换,:%s/abc/123/g)
    vi/vim快捷键

    yy 复制当前行
    p 粘贴
    dd 删除 3dd 删除3行
    dG 删除光标所在以下所有内容
    u 撤销
    ctrl + r 恢复
    x 删除当前光标的内容
    a 光标移动末尾

例:复制4-7行
光标放到第4行,3yy,把光标放到第7行,按k ,就把这三行 复制了

3.创建linux普通用户

    useradd  用户名  #创建的用户信息会放在 / etc / passwd  这个文件下
    useradd  xiaofeng  
    passwd xiaofeng  # 给肖峰更改密码
    userdel - r  用户名  # 删除用户信息,和家目录

4.查看帮助信息

mkdir --help       
man  mkdir 

5.递归创建文件夹信息

mkdir  -p    /tmp/s19/{男同学,女同学/小魏}   

意思是:创建s19文件夹,底下有男同学,女同学目录,且女同学里面有个小魏

6.查看文本cat

more翻页显示文件内容  
less 翻页显示文件内容 用于查看很大的文本  ,
cat读取文件,是一次性读取,非常占内存,用于读取小文本
Touch  创建普通文件

7.复制文件夹,文件

语法:cp 你要复制的内容 复制之后的文件名

cp   filename   filename.bak

8.查找命令

语法:find 从哪找 -name 你要找的文件名
-name 指定文件名字
-type 指定文件类型 f 文本类型 d文件夹类型

find   /       -name   heeh.txt #  全局搜索 
find   /etc   -name  heeh.txt  #局部搜索

找出/etc/下所有的txt文本 (*代表所有)

find   /etc  -name   "*.txt"

找到/etc/下所有的python文件夹

find  /etc  -type  d    -name  python* 

9.grep 管道符的用法

语法:第一条命令 | 第二条命令

ps -ef  |  grep  python  #查看进程信息 

语法: grep [-A] [-B] [--color=auto] '搜寻字符串' filename

特殊符号

grep可以使用正则:

最典型的用法是,匹配指定字符串之间的字符。 比如,我们想在一句话(Hello,my name is aming.)中匹配中间的一段字符串(my name is) 可以这样写正则表达式。
echo "Hello, my name is aming."|grep -P '(?<=Hello, ).*(?= aming.)'

选项与参数:
-A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;
-B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来;
--color=auto 可将正确的那个撷取数据列出颜色

(1)搜寻特定字符串
范例一:用 dmesg 列出核心讯息,再以 grep 找出内含 qxl 那行

[dmtsai@study ~]$ dmesg | grep 'qxl'
[ 0.522749] [drm] qxl: 16M of VRAM memory size
[ 0.522750] [drm] qxl: 63M of IO pages memory ready (VRAM domain)
[ 0.522750] [drm] qxl: 32M of Surface memory size
[ 0.650714] fbcon: qxldrmfb (fb0) is primary device
[ 0.668487] qxl 0000:00:02.0: fb0: qxldrmfb frame buffer device
# dmesg 可列出核心产生的讯息!包括硬件侦测的流程也会显示出来。
# 鸟哥使用的显卡是 QXL 这个虚拟卡,透过 grep 来 qxl 的相关信息,可发现如上信息。

范例二:承上题,要将捉到的关键词显色,且加上行号来表示:

[dmtsai@study ~]$ dmesg | grep -n --color=auto 'qxl'
515:[ 0.522749] [drm] qxl: 16M of VRAM memory size
516:[ 0.522750] [drm] qxl: 63M of IO pages memory ready (VRAM domain)
517:[ 0.522750] [drm] qxl: 32M of Surface memory size
529:[ 0.650714] fbcon: qxldrmfb (fb0) is primary device
539:[ 0.668487] qxl 0000:00:02.0: fb0: qxldrmfb frame buffer device
# 除了 qxl 会有特殊颜色来表示之外,最前面还有行号喔!其实颜色显示已经是默认在 alias 当中了!

范例三:承上题,在关键词所在行的前两行与后三行也一起捉出来显示

[dmtsai@study ~]$ dmesg | grep -n -A3 -B2 --color=auto 'qxl'
# 你会发现关键词之前与之后的数行也被显示出来!这样可以让你将关键词前后数据捉出来进行分析啦!

grep 在数据中查寻一个字符串时,是以 "整行" 为单位来进行数据的撷取的!』也就是说,假如一个文件内有 10 行,其中有两行具有你所搜寻的字符串,则将那两行显示在屏幕上,其他的就丢弃了!

在 CentOS 7 当中,预设已经将 --color=auto 加入在 alias 当中了!用户就可以直接使用有关键词显色的 grep 啰!非常方便!

例: 从刚刚的文件当中取得 the 这个特定字符串

[dmtsai@study ~]$ grep -n 'the' regular_express.txt
8:I can't finish the test.
12:the symbol '*' is represented as start.
15:You are the best is mean you are the no. 1.
16:The world <Happy> is the same with "glad".
18:google is the best tools for search keyword

那如果想要『反向选择』呢?也就是说,当该行没有 'the' 这个字符串时才显示在屏幕上,那就直接使用:

[dmtsai@study ~]$ grep -vn 'the' regular_express.txt

如果你想要取得不论大小写的 the 这个字符串,则:

[dmtsai@study ~]$ grep -in 'the' regular_express.txt
8:I can't finish the test.
9:Oh! The soup taste good.
12:the symbol '*' is represented as start.
14:The gd software is a library for drafting programs.
15:You are the best is mean you are the no. 1.
16:The world <Happy> is the same with "glad".
18:google is the best tools for search keyword

(2)利用中括号 [] 来搜寻集合字符

搜寻 test 或 taste 这两个单字时,可以发现到,其实她们有共通的 't?st' 存在~这个时候,我可以这样来搜寻:

[dmtsai@study ~]$ grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! The soup taste good.

其实 [] 里面不论有几个字符,他都仅代表某『一个』字符, 所以,上面的例子说明了,我需要的字符串是『tast』或『test』两个字符串而已!

而如果想要搜寻到有 oo 的字符时,则使用:

[dmtsai@study ~]$ grep -n 'oo' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! The soup taste good.
18:google is the best tools for search keyword.
19:goooooogle yes!

但是,如果我不想要 oo 前面有 g 的话呢?此时,可以利用在集合字符的反向选择 [^] 来达成:

[dmtsai@study ~]$ grep -n '[^g]oo' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!

第 18 行明明有 google 的 goo 啊~别忘记了,因为该行后面出现了 tool 的 too 啊!所以该行也被列出来~ 也就是说, 18 行里面虽然出现了我们所不要的项目 (goo) 但是由于有需要的项目(too) , 因此,是符合字符串搜寻的喔!

至于第 19 行,同样的,因为 goooooogle 里面的 oo 前面可能是 o ,例如: go(ooo)oogle ,所以,这一行也是符合需求的

假设我 oo 前面不想要有小写字符,所以,我可以这样写 [^abcd....z]oo , 但是这样似乎不怎
么方便,由于小写字符的 ASCII 上编码的顺序是连续的, 因此,我们可以将之简化为底下这样:

[dmtsai@study ~]$ grep -n '[^a-z]oo' regular_express.txt
3:Football game is not use feet only

要取得有数字的那一行:

[dmtsai@study ~]$ grep -n '[0-9]' regular_express.txt
5:However, this dress is about $ 3183 dollars.
15:You are the best is mean you are the no. 1.

也可以用以下方式:

[dmtsai@study ~]$ grep -n '[^[:lower:]]oo' regular_express.txt
# 那个 [:lower:] 代表的就是 a-z 的意思!请参考前两小节的说明表格
[dmtsai@study ~]$ grep -n '[[:digit:]]' regular_express.txt

**(3)行首与行尾字符 ^ $ **

如果我想要开头是小写字符的那一行就列出呢?可以这样:

[dmtsai@study ~]$ grep -n '^[a-z]' regular_express.txt
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as start.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.

或者

[dmtsai@study ~]$ grep -n '^[[:lower:]]' regular_express.txt

那如果我不想要开头是英文字母,则可以是这样:

[dmtsai@study ~]$ grep -n '^[^a-zA-Z]' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
21:# I am VBird
# 指令也可以是: grep -n '^[^[:alpha:]]' regular_express.txt

注意到了吧?那个 ^ 符号,在字符集合符号(括号[])之内与之外是不同的!在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义!

那如果我想要找出来,行尾结束为小数点 (.) 的那一行,该如何处理:

[dmtsai@study ~]$ grep -n '\.$' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
11:This window is clear.
12:the symbol '*' is represented as start.
15:You are the best is mean you are the no. 1.
16:The world <Happy> is the same with "glad".
17:I like dog.
18:google is the best tools for search keyword.
20:go! go! Let's go

因为小数点具有其他意义(底下会介绍),所以必须要使用跳脱字符()来加以解除其特殊意义!

第 5~9 行最后面也是 . 啊~怎么无法打印出来? 这里就牵涉到 Windows 平台的软件对于断行字符的判断问题了!我们使用 cat -A 将第五行拿出来看, 你会发现

[dmtsai@study ~]$ cat -An regular_express.txt | head -n 10 | tail -n 6
 5 However, this dress is about $ 3183 dollars.^M$
 6 GNU is free air not free beer.^M$
 7 Her hair is very beauty.^M$
 8 I can't finish the test.^M$
 9 Oh! The soup taste good.^M$
 10 motorcycle is cheap than car.$

Linux 与 Windows 上的差异, 在上面的表格中我们可以发现5~9 行为 Windows 的断行字符 (^M\() ,而正常的 Linux 应该仅有第 10 行显示的那样 (\)) 。所以啰,那个 . 自然就不是紧接在 $ 之前喔!也就捉不到 5~9 行了!这样可以了解 ^ 与 $ 的意义吗?

那么如果我想要找出来,哪一行是『空白行』, 也就是说,该行并没有输入任何数据,该如何搜寻?

[dmtsai@study ~]$ grep -n '^$' regular_express.txt
22:
![](https://img2022.cnblogs.com/blog/1588432/202208/1588432-20220818151546770-1522582217.png)

因为只有行首跟行尾 (^$),所以,这样就可以找出空白行啦!

找出非 空白行 和 # 注释行

[dmtsai@study ~]$ grep -v '^$' /etc/rsyslog.conf | grep -v '^#'
# 结果仅有 14 行,其中第一个『 -v '^$' 』代表『不要空白行』,
# 第二个『 -v '^#' 』代表『不要开头是 # 的那行』喔!

sed 用法

本身也是一个管线命令,可以分析 standard input 的啦! 而且 sed
还可以将数据进行取代、删除、新增、撷取特定行等等的功能呢!

[dmtsai@study ~]$ sed [-nefr] [动作]
1.选项与参数

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过 sed 特殊处理的那一行(或者动作)才会被列出来。 
-e :直接在指令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以执行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(预设是基础正规表示法语法) -i :直接修改读取的文件内容,而不是由屏幕输出。
动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作
 是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
function 有底下这些咚咚:
a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!
 例如 1,20s/old/new/g 就是啦!

2.(1)删除功能
将 /etc/passwd 的内容列出并且打印行号,同时,请将第 2~5 行删除!

[dmtsai@study ~]$ nl /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
.....(后面省略).....

看到了吧?sed 的动作为 '2,5d' ,那个 d 就是删除!因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行啰~ 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!同时也要注意的是, sed 后面接的动作,请务必以 '' 两个单引号括住喔!如果题型变化一下,举例来说,如果只要删除第 2 行,可以使用『 nl /etc/passwd | sed '2d' 』来达成,至于若是要删除第 3 到最后一行,则是『 nl /etc/passwd | sed '3,$d' 』的啦,那个钱字号『 $ 』代表最后一行!

(2)新增功能
范例二:承上题,在第二行后(亦即是加在第三行)加上『drink tea?』字样!

[dmtsai@study ~]$ nl /etc/passwd | sed '2a drink tea'
 1 root:x:0:0:root:/root:/bin/bash
 2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后面省略).....

嘿嘿!在 a 后面加上的字符串就已将出现在第二行后面啰!那如果是要在第二行前呢?『 nl
/etc/passwd | sed '2i drink tea' 』就对啦!就是将『 a 』变成『 i 』即可。 增加一行很简单,那如果
是要增将两行以上呢?

范例三:在第二行后面加入两行字,例如『Drink tea or .....』与『drink beer?』

[dmtsai@study ~]$ nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer ?'
 1 root:x:0:0:root:/root:/bin/bash
 2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后面省略).....

在多行新增的情况下, \ 是一定要的喔!

(3)取代功能
范例四:我想将第 2-5 行的内容取代成为『No 2-5 number』呢?

[dmtsai@study ~]$ nl /etc/passwd | sed '2,5c No 2-5 number'
 1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
 6 sync:x:5:0:sync:/sbin:/bin/sync
.....(后面省略).....

以前想要列出第 11~20 行, 得要透过『head -n 20 | tail -n 10』之类的方法来处理,很麻烦啦~ sed 则可以简单的直接取出你想要的那几行!是透过行号来捉的喔!看看底下的范例先.

范例五:仅列出 /etc/passwd 文件内的第 5-7 行

[dmtsai@study ~]$ nl /etc/passwd | sed -n '5,7p'
 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 6 sync:x:5:0:sync:/sbin:/bin/sync
 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

上述的指令中有个重要的选项『 -n 』,按照说明文件,这个 -n 代表的是『安静模式』! 那么为什么要使用安静模式呢?你可以自行下达 sed '5,7p' 就知道了 (5-7 行会重复输出)! 有没有加上 -n 的参数时,输出的数据可是差很多的喔!你可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号捉出来查阅!很棒的功能!不是吗?

(4) 部分数据的搜寻并取代的功能
sed 还可以用行为单位进行部分数据的搜寻并取代的功能喔! 基本上sed 的搜寻与取代的与 vi 相当的类似!他有点像这样:

sed 's/要被取代的字符串/新的字符串/g'

上表中特殊字体的部分为关键词,请记下来!至于三个斜线分成两栏就是新旧字符串的替换啦! 我们使用底下这个取得 IP 数据的范例,一段一段的来处理给您瞧瞧,让你了解一下什么是咱们所谓的搜寻并取代吧!

    步骤一:先观察原始讯息,利用 /sbin/ifconfig 查询 IP 为何?

    [dmtsai@study ~]$ /sbin/ifconfig eth0
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
     inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
     inet6 fe80::5054:ff:fedf:e174 prefixlen 64 scopeid 0x20<link>
     ether 52:54:00:df:e1:74 txqueuelen 1000 (Ethernet)
    .....(以下省略).....
    # 因为我们还没有讲到 IP ,这里你先有个概念即可啊!我们的重点在第二行,
    # 也就是 192.168.1.100 那一行而已!先利用关键词捉出那一行!

    步骤二:利用关键词配合 grep 撷取出关键的一行数据
    [dmtsai@study ~]$ /sbin/ifconfig eth0 | grep 'inet '
     inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
    # 当场仅剩下一行!要注意, CentOS 7 与 CentOS 6 以前的 ifconfig 指令输出结果不太相同,
    # 鸟哥这个范例主要是针对 CentOS 7 以后的喔!接下来,我们要将开始到 addr: 通通删除,
    # 就是像底下这样:
    # inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
    # 上面的删除关键在于『 ^.*inet 』啦!正规表示法出现! ^_^

    步骤三:将 IP 前面的部分予以删除
    [dmtsai@study ~]$ /sbin/ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g'
    192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
    # 仔细与上个步骤比较一下,前面的部分不见了!接下来则是删除后续的部分,亦即:
    192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
    # 此时所需的正规表示法为:『 ' *netmask.*$ 』就是啦!

    步骤四:将 IP 后面的部分予以删除
    [dmtsai@study ~]$ /sbin/ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g' \
    > | sed 's/ *netmask.*$//g'
    192.168.1.100
  1. sed 与正规表示法的配合练习
    假设我只要 MAN 存在的那几行数据, 但是含有 # 在内的批注我不想要,而且空白行我也不要!

     步骤一:先使用 grep 将关键词 MAN 所在行取出来
     [dmtsai@study ~]$ cat /etc/man_db.conf | grep 'MAN'
     # MANDATORY_MANPATH manpath_element
     # MANPATH_MAP path_element manpath_element
     # MANDB_MAP global_manpath [relative_catpath]
     # every automatically generated MANPATH includes these fields
     ....(后面省略)....
    
     步骤二:删除掉批注之后的数据!
     [dmtsai@study ~]$ cat /etc/man_db.conf | grep 'MAN'| sed 's/#.*$//g'
    
    
    
     MANDATORY_MANPATH /usr/man
     ....(后面省略)....
     # 从上面可以看出来,原本批注的数据都变成空白行啦!所以,接下来要删除掉空白行
    
     [dmtsai@study ~]$ cat /etc/man_db.conf | grep 'MAN'| sed 's/#.*$//g' | sed '/^$/d'
     MANDATORY_MANPATH /usr/man
     MANDATORY_MANPATH /usr/share/man
     MANDATORY_MANPATH /usr/local/share/man
     ....(后面省略)....
    
  2. 直接修改文件内容(危险动作)
    由于这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置文件来测试喔! 我们还是使用你下载的 regular_express.txt文件来测试看看吧!

     范例六:利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !
     [dmtsai@study ~]$ sed -i 's/\.$/\!/g' regular_express.txt
     # 上头的 -i 选项可以让你的 sed 直接去修改后面接的文件内容而不是由屏幕输出喔!
     # 这个范例是用在取代!请您自行 cat 该文件去查阅结果啰!
    
     范例七:利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』
     [dmtsai@study ~]$ sed -i '$a # This is a test' regular_express.txt
     # 由于 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增啰!
    

sed 的『 -i 』选项可以直接修改文件内容,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!很棒吧!

  1. 延伸正规表示法

在上节的例题三的最后一个例子中,我们要去除空白行与行首为 # 的行列,使用的是

grep -v '^$' regular_express.txt | grep -v '^#'

需要使用到管线命令来搜寻两次!那么如果使用延伸型的正规表示法,我们可以简化为:

egrep -v '^$|^#' regular_express.txt

延伸型正规表示法可以透过群组功能『 | 』来进行一次搜寻!那个在单引号内的管线意义为『或 or』啦! 是否变的更简单呢?此外,grep 预设仅支持基础正规表示法,如果要使用延伸型正规表示法,你可以使用 grep -E , 不过更建议直接使用 egrep !直接区分指令比较好记忆!其实 egrep 与 grep -E 是类似命令别名的关系啦!

延伸型正规表示法有哪几个特殊符号?


以上这些就是延伸型的正规表示法的特殊字符。另外,要特别强调的是,那个 ! 在正规表示法当中
并不是特殊字符, 所以,如果你想要查出来文件中含有 ! 与 > 的字行时,可以这样:
grep -n '[!>]' regular_express.txt

格式化打印: printf

  1. 用法

    [dmtsai@study ~]$ printf '打印格式' 实际内容

  2. 参数

    选项与参数: 关于格式方面的几个特殊样式:
     \a 警告声音输出
     \b 退格键(backspace)
     \f 清除屏幕 (form feed)
     \n 输出新的一行
     \r 亦即 Enter 按键
     \t 水平的 [tab] 按键
     \v 垂直的 [tab] 按键
     \xNN NN 为两位数的数字,可以转换数字成为字符。
    关于 C 程序语言内,常见的变数格式
     %ns 那个 n 是数字, s 代表 string ,亦即多少个字符;
     %ni 那个 n 是数字, i 代表 integer ,亦即多少整数字数;
     %N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数字数,
     假设我共要十个位数,但小数点有两位,即为 %10.2f 啰!
    
    
    范例一:将刚刚上头数据的文件 (printf.txt) 内容仅列出姓名与成绩:(用 [tab] 分隔)
    [dmtsai@study ~]$ printf '%s\t %s\t %s\t %s\t %s\t \n' $(cat printf.txt)
    Name Chinese English Math Average
    DmTsai 80 60 92 77.33
    VBird 75 55 80 70.00
    Ken 60 90 70 73.33
    

由于 printf 并不是管线命令,因此我们得要透过类似上面的功能,将文件内容先提出来给 printf 作为后续的资料才行。 如上所示,我们将每个数据都以 [tab] 作为分隔,但是由于 Chinese 长度太长,导致 English 中间多了一个 [tab] 来将资料排列整齐!啊~结果就看到资料对齐结果的差异了!

另外,在 printf 后续的那一段格式中,%s 代表一个不固定长度的字符串,而字符串与字符串中间就以 \t 这个 [tab] 分隔符来处理!你要记得的是,由于 \t 与 %s 中间还有空格,因此每个字符串间会有一个 [tab] 与一个空格键的分隔喔!

既然每个字段的长度不固定会造成上述的困扰,那我将每个字段固定就好啦!没错没错!这样想非常
好! 所以我们就将数据给他进行固定字段长度的设计吧!

    范例二:将上述资料关于第二行以后,分别以字符串、整数、小数点来显示:
    [dmtsai@study ~]$ printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt | grep -v Name)
     DmTsai 80 60 92 77.33
     VBird 75 55 80 70.00
     Ken 60 90 70 73.33

上面的格式共分为五个字段, %10s 代表的是一个长度为 10 个字符的字符串字段,%5i 代表的是长度为 5 个字符的数字字段,至于那个 %8.2f 则代表长度为 8 个字符的具有小数点的字段,其中小数点有两个字符宽度。我们可以使用底下的说明来介绍 %8.2f 的意义:
字符宽度: 12345678
%8.2f 意义:00000.00

如上所述,全部的宽度仅有 8 个字符,整数部分占有 5 个字符,小数点本身 (.) 占一位,小数点下的位数则有两位。

printf 除了可以格式化处理之外,他还可以依据 ASCII 的数字与图形对应来显示数据喔(注 3)! 举
例来说 16 进位的 45 可以得到什么 ASCII 的显示图 (其实是字符啦)?

范例三:列出 16 进位数值 45 代表的字符为何?

[dmtsai@study ~]$ printf '\x45\n'
E
# 这东西也很好玩~他可以将数值转换成为字符,如果你会写 script 的话,
# 可以自行测试一下,由 20~80 之间的数值代表的字符是啥喔! ^_^

awk:好用的数据处理工具

[dmtsai@study ~]$ awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename

awk 后面接两个单引号并加上大括号 {} 来设定想要对数据进行的处理动作。awk 主要是处理『每一行
的字段内的数据』,而默认的『字段的分隔符为 "空格键" 或 "[tab]键" 』!

[dmtsai@study ~]$ last -n 5 <==仅取出前五行
dmtsai pts/0 192.168.1.100 Tue Jul 14 17:32 still logged in
dmtsai pts/0 192.168.1.100 Thu Jul 9 23:36 - 02:58 (03:22)
dmtsai pts/0 192.168.1.100 Thu Jul 9 17:23 - 23:36 (06:12)
dmtsai pts/0 192.168.1.100 Thu Jul 9 08:02 - 08:17 (00:14)
dmtsai tty1 Fri May 29 11:55 - 12:11 (00:15)

若我想要取出账号与登入者的 IP ,且账号与 IP 之间以 [tab] 隔开,则会变成这样:

[dmtsai@study ~]$ last -n 5 | awk '{print $1 "\t" $3}'
dmtsai 192.168.1.100
dmtsai 192.168.1.100
dmtsai 192.168.1.100
dmtsai 192.168.1.100
dmtsai Fri

字段的分隔则以空格键或 [tab] 按键来隔开。 因为不论哪一行我都要处理,因此,就不需要有 "条件类型" 的限制!我所想要的是第一栏以及第三栏, 但是,第五行的内容怪怪的~这是因为数据格式的问题啊!所以啰~使用 awk 的时候,请先确认一下你的数据当中,如果是连续性的数据,请不要有空格或[tab] 在内,否则,就会像这个例子这样,会发生误判喔!

另外,由上面这个例子你也会知道,在 awk 的括号内,每一行的每个字段都是有变量名称的,那就
是 $1, $2... 等变量名称。以上面的例子来说,dmtsai 是 $1 ,因为他是第一栏嘛!至于 192.168.1.100
是第三栏, 所以他就是 $3 啦!后面以此类推~呵呵!还有个变数喔!那就是 $0 ,$0 代表『一整
列资料』的意思~以上面的例子来说,第一行的 $0 代表的就是『dmtsai .... 』那一行啊! 由此可知,
刚刚上面五行当中,整个 awk 的处理流程是:

1. 读入第一行,并将第一行的资料填入 $0, $1, $2.... 等变数当中;
2. 依据 "条件类型" 的限制,判断是否需要进行后面的 "动作";
3. 做完所有的动作与条件类型;
4. 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。

经过这样的步骤,你会晓得, awk 是『以行为一次处理的单位』, 而『以字段为最小的处理单位』。好了,那么 awk 怎么知道我到底这个数据有几行?有几栏呢?这就需要 awk 的内建变量的帮忙啦~

我们继续以上面 last -n 5 的例子来做说明,如果我想要:
 列出每一行的账号(就是 $1);  列出目前处理的行数(就是 awk 内的 NR 变量)  并且说明,该行有多少字段(就是 awk 内的 NF 变量)
则可以这样:

要注意喔,awk 后续的所有动作是以单引号『 ' 』括住的,由于单引号与双引号都必须是成对的, 所以, awk 的格式内容如果想要以 print 打印时,记得非变量的文字部分,包含上一小节 printf 提到的格式中,都需要使用双引号来定义出来喔!因为单引号已经是 awk 的指令固定用法了!

[dmtsai@study ~]$ last -n 5| awk '{print $1 "\t lines: " NR "\t columns: " NF}'
dmtsai lines: 1 columns: 10
dmtsai lines: 2 columns: 10
dmtsai lines: 3 columns: 10
dmtsai lines: 4 columns: 10
dmtsai lines: 5 columns: 9
# 注意喔,在 awk 内的 NR, NF 等变量要用大写,且不需要有钱字号 $ 啦!

(2)awk 的逻辑运算字符
既然有需要用到 "条件" 的类别,自然就需要一些逻辑运算啰~例如底下这些:

值得注意的是那个『 == 』的符号,因为:
 逻辑运算上面亦即所谓的大于、小于、等于等判断式上面,习惯上是以『 == 』来表示;
 如果是直接给予一个值,例如变量设定时,就直接使用 = 而已。

举例说,在 /etc/passwd 当中是以冒号 ":" 来作为字段的分隔, 该文件中第一字段为账号,第三字段则是 UID。那假设我要查阅,第三栏小于 10 以下的数据,并且仅列出账号与第三栏, 那么可以这样做:

[dmtsai@study ~]$ cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t " $3}'
root:x:0:0:root:/root:/bin/bash
bin 1
daemon 2
....(以下省略)....

不过,怎么第一行没有正确的显示出来呢?这是因为我们读入第一行的时候,那些变数 $1,
$2... 默认还是以空格键为分隔的,所以虽然我们定义了 FS=":" 了, 但是却仅能在第二行后才开始
生效。那么怎么办呢?我们可以预先设定 awk 的变量啊! 利用 BEGIN 这个关键词喔!这样做:

[dmtsai@study ~]$ cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
root 0
bin 1
daemon 2
......(以下省略)......

而除了 BEGIN 之外,我们还有 END 呢!另外,如果要用 awk 来进行『计算功能』呢?
以底下的例子来看, 假设我有一个薪资数据表档名为 pay.txt ,内容是这样的

Name 1st 2nd 3th
VBird 23000 24000 25000
DMTsai 21000 20000 23000
Bird2 43000 42000 41000

如何帮我计算每个人的总额呢?而且我还想要格式化输出喔!我们可以这样考虑:
 第一行只是说明,所以第一行不要进行加总 (NR==1 时处理);
 第二行以后就会有加总的情况出现 (NR>=2 以后处理)

[dmtsai@study ~]$ cat pay.txt | \
> awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total" }
> NR>=2{total = $2 + $3 + $4
> printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'
 Name 1st 2nd 3th Total
 VBird 23000 24000 25000 72000.00
 DMTsai 21000 20000 23000 64000.00
 Bird2 43000 42000 41000 126000.00

上面的例子有几个重要事项应该要先说明的:

 awk 的指令间隔:所有 awk 的动作,亦即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号『;』
间隔, 或者直接以 [Enter] 按键来隔开每个指令,例如上面的范例中,鸟哥共按了三次 [enter] 喔!
 逻辑运算当中,如果是『等于』的情况,则务必使用两个等号『==』!
 格式化输出时,在 printf 的格式设定当中,务必加上 \n ,才能进行分行!
 与 bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。

awk 的输出格式当中,常常会以 printf 来辅助,所以, 最好你对 printf 也稍微熟悉一下比较好啦!另外, awk 的动作内 {} 也是支持 if (条件) 的喔! 举例来说,上面的指令可以修订成为这样:

[dmtsai@study ~]$ cat pay.txt | \
> awk '{if(NR==1) printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
> NR>=2{total = $2 + $3 + $4
> printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'

我个人是比较倾向于使用第一种语法, 因为会比较有统一性啊!

diff 文件对比

diff 通常是用在同一的文件(或软件)的新旧版本差异上! 举例来说,假如我们要将 /etc/passwd 处理成为一个新的版本,处理方式为: 将第四行删除,
第六行则取代成为『no six line』,新的文件放置到 /tmp/test 里面,那那么应该怎么做?

[dmtsai@study ~]$ mkdir -p /tmp/testpw <==先建立测试用的目录
[dmtsai@study ~]$ cd /tmp/testpw
[dmtsai@study testpw]$ cp /etc/passwd passwd.old
[dmtsai@study testpw]$ cat /etc/passwd | sed -e '4d' -e '6c no six line' > passwd.new
# 注意一下, sed 后面如果要接超过两个以上的动作时,每个动作前面得加 -e 才行!
# 透过这个动作,在 /tmp/testpw 里面便有新旧的 passwd 文件存在了!

关于diff的用法

[dmtsai@study ~]$ diff [-bBi] from-file to-file
选项与参数:
from-file :一个档名,作为原始比对文件的档名;
to-file :一个档名,作为目的比对文件的档名;
注意,from-file 或 to-file 可以 - 取代,那个 - 代表『Standard input』之意。

-b :忽略一行当中,仅有多个空白的差异(例如 "about me" 与 "about me" 视为相同
-B :忽略空白行的差异。
-i :忽略大小写的不同。

范例一:比对 passwd.old 与 passwd.new 的差异:
[dmtsai@study testpw]$ diff passwd.old passwd.new
4d3 <==左边第四行被删除 (d) 掉了,基准是右边的第三行
< adm:x:3:4:adm:/var/adm:/sbin/nologin <==这边列出左边(<)文件被删除的那一行内容
6c5 <==左边文件的第六行被取代 (c) 成右边文件的第五行
< sync:x:5:0:sync:/sbin:/bin/sync <==左边(<)文件第六行内容
---
> no six line <==右边(>)文件第五行内容
# 很聪明吧!用 diff 就把我们刚刚的处理给比对完毕了!

你不要用 diff 去比对两个完全不相干的文件,因为比不出个啥咚咚! 另外, diff 也可以比对整个目录下的差异喔!举例来说,我们想要了解一下不同的开机执行等级 (runlevel) 内容有啥不同?假设你已经知道执行等级 0 与 5 的启动脚本分别放置到/etc/rc0.d 及 /etc/rc5.d , 则我们可以将两个目录比对一下:

[dmtsai@study ~]$ diff /etc/rc0.d/ /etc/rc5.d/
Only in /etc/rc0.d/: K90network
Only in /etc/rc5.d/: S10network

sar命令

在使用UNIX操作系统的过程中,我们常常会用到各种各样的问题,比如系统运行速度突然变慢,系统容易死机或者主机所带的终端常出现死机,这时我们常常猜测,是硬盘空间太小,还是内存不足?I/O出现瓶颈,或者是系统的核心参数出了问题?这时,我们应该考虑使用系统给我们提供的sar命令来对系统作一个了解,该命令是系统维护的重要工具,主要帮助我们掌握系统资源的使用情况,特别是内存和CPU 的使用情况,是UNIX系统使用者应该掌握的工具之一。

  1. sar命令常用格式

https://blog.csdn.net/weixin_44232712/article/details/121084965

10.端口信息

Redis  6379         
mysql  3306    
mongodb   27017
80  http web服务器端口
443  https  加密的http协议
8000  django 
22    ssh协议用的端口 
8080  自定义的端口 
netstat -tunlp |grep  	3306  #确认mysql是否启动了3306端口
netstat -tunlp |grep   8000   #验证django是否正常启动 

11.过滤字符串命令,过滤文本信息

语法 : grep 参数 你要过滤字符串 你要操作的文件

grep -i  "all"  settings.py 
-i 是忽略大小写        -v 是翻转搜索结果

1)过滤掉settings.py中无用的信息(空白行,注释行)

grep   -v  "^#"   settings.py   |  grep -v "^$"  

2)过滤出file1中以abc结尾的行

grep 'abc$' file1

12.查看,检测文件

head  -5  filename  #看文件的前5行
tail  -5  filename   #看文件的后5行
tail -f   fielname  #实时监测文件信息

13.alias 别名

alias rm="echo 你这个大傻x,求你别用rm了"
unalias  rm   #取消别名 ,重新赋值别名变量也可以

14.远程传输命令scp

语法: scp 你想传输的内容 你想传输到的地方

1)把自己的文件 发送给别人

scp  小姐姐电话.txt  root@192.168.16.41:/tmp/

2)把别人的文件夹拿过来

scp -r root@192.168.16.41:/tmp/s19/  ./

3)把自己的文件夹,发送给别人

scp  -r  你的文件夹    用户名@其他人的服务器ip:路径

15.如何查看文件夹大小du -sh

ls -lh   .   #详细的显示当前文件信息,和大小单位
ll   等于 ls   -l 
du -sh  /var/log/   # -h 显示 kb  mb gb 单位     -s  显示合计大小

16.linux的任务管理器

top命令

17.给文件加锁,解锁

chattr +a   filename  #给文件加锁 让文件不得删除
chattr -a  filename  #减锁
lsattr   filname  #显示文件是否有锁

18.时间同步

date 查看当前系统时间

和阿里云的时间服务器同步
ntpdate -u  ntp.aliyun.com     #和阿里的时间服务器同步  	-u  更新 
call :查看日历

19.切换用户 su

Whoami  #先看下当前用户(我是谁)
su - oldboy    #切换用户
logout    ctrl + d  #退出用户登录

20.解压缩源代码

语法: tar -xf Python-3.6.2.tgz
tar 是压缩解压的命令 -x 是解压参数 -f 指定一个压缩文件的名字

1)解压缩命令

-c  打包             
-x  解包
-z  调用gzip命令去压缩文件,节省磁盘空间          
-v  显示打包过程

语法: tar -cvf 打包文件的名字 你要打包的内容

压缩<打包>当前的所有内容到alltmp.tar这个文件中,这里不节省磁盘

tar  -cvf  压缩文件的名字.tar   ./*

解压的方式

tar  -xvf  压缩文件的名字.tar

打包文件,并且压缩文件大小的用法,节省磁盘

tar  -zcvf  压缩文件的名字.tar.gz  ./*  

解压缩

tar -zxvf  压缩文件的名字.tar.gz  

21.linux下载软件包的方法有?

wget curl

22.linux如何安装软件?有几种方式?

yum  rpm  源码包

rpm命令的使用方式:

安装软件的命令格式                rpm -ivh filename.rpm     # i表示安装   v显示详细过程  h以进度条显示
升级软件的命令格式                rpm -Uvh filename.rpm
卸载软件的命令格式                rpm -e filename.rpm
查询软件描述信息的命令格式         rpm -qpi filename.rpm
列出软件文件信息的命令格式         rpm -qpl filename.rpm
查询文件属于哪个 RPM 的命令格式   rpm -qf filename

23.linux和windows互传文件的软件 lrzsz

yum  install lrzsz -y    
rz   接受文件(从windows接受文件)
sz   发送文件(发送linux文件给windows)

24.临时提权的命令sudo

1.修改sudoers配置文件,把你想提权的用户写进去

编辑配置文件
vim  /etc/sudoers

2.写入如下信息,定位到那一行
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
kun ALL=(ALL) ALL #允许kun在任何地方,执行任何命令
3.使用sudo命令

sudo 你想执行的命令

25.文件拥有者分三类

属主 users   u  	
属组 group  g	
其他人others   o  
-  普通文本   
d  文件夹 	
l  软连接
R  可读  w 可写  x 可执行          

修改权限

chmod  权限   文件/文件夹权限 
chmod 777  你好.txt  #赋予文本最高的权限
权限分为:  r 4     w 2     x 1  

更改文件的属主,属组

chown  用户名  要操作的文件  #更改文件属主
chgrp  组名   要操作的文件  #更改文件属组

26.软连接

语法: ln -s 目标文件 快捷方式绝对路径

27.linux的命令提示符

PS1变量
echo $PS1  #显示命令提示符

修改命令提示符
PS1="[\u@\h \w \t]\$"

27.什么是dns(域名解析系统)

其实就是一个超大的网络电话簿 ,dns就是域名解析到ip的一个过程,
linux的dns配置文件如下 :

vim /etc/resolv.conf 

linux解析dns的命令:

nslookup  域名

解析流程:
自上而下的顺序

1.优先查找本地dns缓存
2.查找本地/etc/hosts文件,是否有强制解析
3.如果没有去/etc/resolv.conf指定的dns服务器中查找记录(需联网
4.在dns服务器中找到解析记录后,在本地dns中添加缓存
5.完成一次dns解析

如何给linux添加一个dns服务器记录

echo "nameserver 114.114.114.114" >>  /etc/resolv.conf

28.定时任务

分 时 日 月 周

          • 命令的绝对路径

例:每周一到周五的凌晨1点,清空/tmp目录的所有文件

00  1   *   *   1-5   	/usr/bin/rm -rf  /tmp/*  

在晚上8-11点的第3和第15分钟执行

3,15   20-23 *  *  *    命令的绝对路径

29.yum源的工作目录是?

/etc/yum.repos.d/  在这个目录下
所有名字是 *.repo的文件,就会被识别为仓库文件
Yum makecache生成yum缓存

30.tree是什么作用?

以树状图显示文件夹内容

31.系统用户的环境变量配置文件是?

.修改/.bash_profile(首选),将影响当前用户。在/.bash_profile文件中添加

系统全局环境变量配置文件是?
/etc/profile

31.防火墙

防火墙作用:保护服务器的流量网络安全,允许/禁止 ip地址段和端口的出入流量

systemctl stop firewalld.service 	 #关闭防火墙服务
systemctl disable firewalld.service   #禁止防火墙开机自启
iptables -F  #清空防火墙规则

Virtualenv 虚拟环境

含义:virtualenv就是用来为一个应用创建一套“隔离”的Python运行环境。

1.python的虚拟环境,用于解决python环境依赖冲突的问题,仅仅是多个解释器的分身,多个解释器的复制,和操作系统无关
2.python虚拟环境的工具有很多 ,有virtualenv,pipenv ,pyenv
3.virtualenv 可以在系统中建立多个不同并且相互不干扰的虚拟环境。

创建虚拟环境

这个命令,在哪敲,就会在哪生成venv文件夹

virtualenv --no-site-packages --python=python3  venv   #得到独立第三方包的环境,并且指定解释器是python3
#参数解释
 --no-site-packages   #这个参数用于构建,干净的环境,没有任何的第三方包
 --python=python3   #指定虚拟环境的本体,是python的哪一个版本 
 venv 就是一个虚拟环境的文件夹,是虚拟python解释器
source  activate    #source是读取指令,读取这个activate脚本中的内容,激活虚拟环境

virtualenvwrapper

Virtaulenvwrapper是virtualenv的扩展包,用于更方便管理虚拟环境

命令:

mkvirtualenv  虚拟环境的名字  #创建虚拟环境,存放目录是统一管理的
workon  虚拟环境的名字  #可以在任意目录直接激活虚拟环境
rmvirtualenv  虚拟环境的名字  #删除虚拟环境
lsvirtualenv  #列出所有的虚拟环境
cdvirtualenv   #进入虚拟环境的目录
cdsitepackages  #进入虚拟环境的第三方包

virtualenv和virtualenvwrapper区别:

virtualenv每次开启虚拟环境之前要去虚拟环境所在目录下的 bin 目录下 source 一下 activate,

Virtualenvwrapper

1.安装虚拟环境 pip3 install virtualenvwrapper
2.创建并进入虚拟环境 mkvirtualenv env1
3.切换虚拟环境 workon 虚拟环境名

nginx

web服务器(nginx): 接收HTTP请求(例如www.pythonav.cn/xiaocang.jpg)并返回数据
web框架(django,flask): 开发web应用程序,处理接收到的数据

1.静态网站
就是不变化的网页,静态的html,css js等页面,以及jpg gif mp4等静态资源

2.动态网站
指的是,可以与数据库打交道,数据交互的网页,网页内容根据数据库的数据变化

3..常见web服务器有哪些
windows下 IIS服务器
linux下的web服务器 nginx apache lighthttp

4.web服务器
nginx 这样的软件

web服务器它自己 不支持 编程,仅仅是页面返回,nginx + lua
django flask tornado这样的 web逻辑框架 支持 程序员自己写代码,进行逻辑处理

nginx是什么

nginx是web服务器、反向代理服务器、邮件代理服务器,负载均衡等等,支持高并发的一款web服务器

为什么Nginx性能这么高

因为他的事件处理机制:异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决

为什么要用Nginx

1.跨平台、配置简单、方向代理、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发,内存消耗小:开启10个nginx才占150M内存 ,nginx处理静态文件好,耗费内存少,

2.而且Nginx内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。

3.使用Nginx的话还能:

节省宽带:支持GZIP压缩,可以添加浏览器本地缓存
稳定性高:宕机的概率非常小
接收用户请求是异步的

启动nginx

直接输入nginx 指令,默认代表启动,不得再执行第二次

nginx  
nginx -s reload  #平滑重启nginx,不重启nginx,仅仅是重新读取nginx配置文件
nginx -s stop  #停止nginx进程
nginx -t   #检测nginx.conf的语法

Nginx怎么处理请求的
nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址

server{ # 一个虚拟主机
listen 80; # 监听的端口,访问的端口80
server_name 192.168.11.11; # 访问的域名192.168.11.11
location / { # 访问的路径 /
root html; # 指定页面的目录,访问/会找到html目录
index index.html # 指定网页,访问/就是访问index.html
}
}

server{ #虚拟主机
listen 8080; #nginx监听端口
server_name 192.168.11.11; #nginx访问域名
location / { #location匹配url
include uwsgi_params; #将uwsgi参数添加进nginx
uwsgi_pass 0.0.0.0:8000; #反向代理转发请求给uwsgi
}
}

location的语法能说出来吗

解释目录

conf  存放nginx配置文件的
html  存放前端文件目录  ,首页文件就在这里
logs  存放nginx运行日志,错误日志的
sbin  存放nginx执行脚本的

nginx的反向代理功能

1.见过生活中的代理
客户端(请求资源) -> 代理(转发资源) -> 服务端(提供资源)

功能参数: proxy_pass

使用“反向代理服务器的优点是什么
反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和web服务器之间的中间层。这对于安全方面来说是很好的,特别是当您使用web托管服务时。

如何永久添加/opt/python36/的环境变量?

vim /etc/profile
添加PATH = /opt/python36/bin:
source /etc/profile

负载均衡

参数:upstream 地址池

Nginx负载均衡与Nginx代理不同地方在于
Nginx代理仅代理一台服务器,而Nginx负载均衡则是将客户端请求代理转发至一组upstream虚拟服务池
分摊到多个操作单元上进行执行

负载均衡的规则

轮询 ((不做配置,默认轮询))   按时间顺序逐一分配到不同的后端服务器(默认)
Weight(权重(优先级)) 加权轮询,weight值越大,分配到的访问几率越高,最常用的方式,
ip_hash(配置,根据客户端ip哈希分配,不能和weight一起用)      每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器
url_hash      按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器
least_conn    最少链接数,那个机器链接数少就分发

为什么要用nginx结合uwsgi

1.nginx支持静态文件处理性能更好,django uwsgi,默认不支持静态文件解析 
2.nginx的负载均衡特性,让网站并发性更高
3.并且反向代理特性,用户访问 80,即可访问到8000的应用
4.uwsgi支持多进程的方式,启动django,性能更高
5.nginx转发请求给uwsgi ,应该用 uwsgI_pass  ,实现了uwsgi协议的请求转发

Nginx的优缺点
优点:

占内存小,可实现高并发连接,处理响应快
可实现http服务器、虚拟主机、反向代理、负载均衡
Nginx配置简单
可以不暴露正式的服务器IP地址

缺点:
动态处理差:nginx处理静态文件好,耗费内存少,但是处理动态页面则很鸡肋,现在一般前端用nginx作为反向代理抗住压力,

如何用Nginx解决前端跨域问题
使用Nginx转发请求。把跨域的接口写成调本域的接口,然后将这些接口转发到真正的请求地址

Nginx虚拟主机怎么配置?

1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站
2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台
3、基于ip的虚拟主机。
基于虚拟主机配置域名
需要建立/data/www /data/bbs目录,windows本地hosts添加虚拟机ip地址对应的域名解析;对应域名网站目录下新增index.html文件;

基于端口的虚拟主机
使用端口来区分,浏览器使用域名或ip地址:端口号 访问

进程管理工具supervisor

其实就是在帮咱们去执行命令

退出虚拟环境,在物理环境下安装

supervisorctl       这是管理命令
supervisord  	这个是服务端命令 

启动supervisor服务

supervisord -c /etc/supervisor.conf 

启动所有项目

supervisorctl -c /etc/supervisor.conf 

停止任务

supervisor> stop s19_ob_crm 
s19_ob_crm: stopped

查看任务状态

supervisor> status 
s19_ob_crm                       STOPPED   May 08 12:23 PM

停止所有的任务

supervisor> stop all 
s19_ob_crm                       STOPPED   May 08 12:23 PM

启动所有任务

supervisor> start all 
s19_ob_crm                       RUNNING   May 08 12:23 PM

Redis 缓存数据库

https://www.cnblogs.com/pyyu/p/9467279.html
./redis-cli //redis的客户端
./redis-server //redis的服务端

redis面试题 https://blog.csdn.net/weixin_40205234/article/details/124614720

Redis是一个开源的基于内存的,key-value数据结构的缓存数据库,支持数据持久化,m-s复制,读写速度快。
主要用来做什么
redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。
特点

Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

redis为什么快

  1. 基于内存存储实现的(内存读写比磁盘快)
    2.高效的数据结构(字典 Redis 作为 K-V 型内存数据库,所有的键值就是用字典来存储。字典就是哈希表,比如HashMap,通过key就可以直接获取到对应的value。而哈希表的特性,在O(1)时间复杂度就可以获得对应的值。)
    redis应用场景
    缓存
    排行榜
    计数器应用
    共享Session
    分布式锁
    社交网络
    消息队列
    位操作

怎么实现Redis高可用

将数据库复制多个副本以部署在不同的服务器上,其中一台挂了也可以继续提供服务。Redis 实现高可用有三种部署模式:主从模式,哨兵模式,集群模式。

redis事务

Redis事务就是顺序性、一次性、排他性的执行一个队列中的一系列命令。

Redis执行事务的流程如下:
开始事务(MULTI)
命令入队
执行事务(EXEC)、撤销事务(DISCARD )

1.数据类型 string set hash list

1)字符串(strings)
语法:set key value

set name  dsb #设置name为key,值是dsb
get  name   #获取name的值
append  追加string
mset   设置多个键值对
mget   获取多个键值对
del  删除key
incr  递增+1
decr  递减-1

2)散列(hashes) 字典key-value
语法 hset key field value

hset 设置散列值
hget  获取散列值
hmset  设置多对散列值
hmget  获取多对散列值
hsetnx   如果散列已经存在,则不设置(防止覆盖key)
hkeys     返回所有keys
hvals     返回所有values
hlen      返回散列包含域(field)的数量
hdel     删除散列指定的域(field)
hexists    判断是否存在

例:

hset news1 content "news content"    #添加一个conntent内容
hget news1  content  #获取news的内容

3)列表(lists)

lpush         从列表左边插
rpush         从列表右边插
lrange          获取一定长度的元素  lrange key  start stop
ltrim               截取一定长度列表
lpop                 删除最左边一个元素
rpop                     删除最右边一个元素
lpushx/rpushx                key存在则添加值,不存在不处理

4)集合(set)无序,去重的数据类型

sadd/srem   添加/删除 元素
sismember   判断是否为set的一个元素
smembers    返回集合所有的成员
sdiff             返回一个集合和其他集合的差异
sinter           返回几个集合的交集
sunion          返回几个集合的并集

5)有序集合(zset)

keys *  查看机器所有的key  
type key  #显示key的类型
expire key  #给key加上过期时间
ttl key  #查看key的剩余 过期时间 -1 是永不过期  -2 是没有这个key
persist    # 取消key的过期时间   -1表示key存在,没有过期时间
exists key     #判断key存在    存在返回1    否则0
dbsize         #计算key的数量

2.发布订阅

发布 PUBLISH 订阅 SUBSCRIBE

3.redis 数据持久化

背景:进程被杀死,服务器断电,内存中的数据都会被释放,数据丢失,如果redis没有持久化,数据丢失

RDB

基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能
通过save指令可以手动触发 持久化
也可以配置时间触发持久化
save  900 1    #900秒  1个修改类的操作

aof:

AOF文件内容是字符串
以追加的方式记录redis操作日志的文件。
可以最大程度的保证redis数据安全,类似于mysql的binlog

AOF
优点:数据安全,不怕数据损坏
缺点:,占磁盘,性能损耗高,数据恢复慢
Rdb:
定期保存数据快照 数据可能会丢失,但是持久化速度最快
使用RDB恢复数据:自动的持久化数据存储到dump.rdb后。实际只要重启redis服务即可完成(启动redis的server时会从dump.rdb中先同步数据)

使用save进行本地存储

save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。
save 900 1
save 300 10
save 60 10000

客户端使用命令进行持久化save存储:

./redis-cli -h ip -p port save
./redis-cli -h ip -p port bgsave

怎么在不重启的情况下将rdb切换成aof
此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能 ,只有在“yes”下,aof重写/文件同步等特性才会生效

CONFIG set appendonly yes
CONFIG SET save "" 

4.高可用之哨兵功能 redis-sentinel

redis哨兵是监控redis主从服务,不存储数据的,
作用是用于自动切换reidis服务主从关系,即当主库服务停止后,会将其中一个从库变为主库

5.redis-cluster集群搭建

redis的集群还未分配 槽位 slots ,我们得下载ruby的脚本,创建这个16384个槽位分配
集群,也就是分布式存储,至少有三个主库才可以运行
使用集群,只需要将每个数据库节点的车路士特热-嗯啊变了配置打开即可

redis 和memcache的区别

1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例                    如图片、视频等等。 
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。 
3、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘 
4、过期策略–memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10 
5、分布式–设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从 
6、存储数据安全–memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化) 
7、灾难恢复–memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复 
8、Redis支持数据的备份,即master-slave模式的数据备份。

总结
有持久化需求或者对数据结构和处理有高级要求的应用,选择redis,其他简单的key/value存储,选择memcache。

docker和k8s的区别

k8s的全称 kubernetes。它是一个完整的分布式系统支撑平台,集群管理功能齐全。Kubernetes同时提供完善的管理工具,涵盖了开发、部署、测试、运行监控等各个环节。k8s是一种开放源码的容器集群管理系统,能够实现自动化部署、扩展容器集群、维护等功能。

Docker是一种开放源码的应用容器引擎,允许开发人员将其应用和依赖包打包成可移植的镜像,然后发布到任何流行的 Linux或 Windows机器上,也能实现虚拟化。该容器完全使用沙箱机制,彼此之间没有任何接口。

Docker是一种开放源码的应用容器引擎,开发者可以将他们的应用和依赖打包在一个可移植的容器中,发布到流行的 Linux机器上,也可以实现虚拟化。

docker 和 virtualenv 的区别

virtualenv虚拟python运行环境,保证系统python环境的整洁,docker也是一样,只是它虚拟的是系统运行环境。

Docker

docker是容器软件,应用于快速构建应用

1.docker的三大生命周期

容器 镜像 .仓库
仓库有dockerhub 共有仓库,docker registory私有仓库,存放镜像的地方

2.镜像:

增删查

docker search 镜像名字  # 搜索镜像名
docker search hello-world  #搜索docker镜像
docker pull 镜像名  #下载docker镜像 
docker image ls  #查看当前机器的docker镜像
docker images      #同上,查看本机的所有docker镜像
docker rmi  镜像名/镜像id   #删除docker镜像 
docker run  -d后台运行   镜像名 
            -p指定端口映射  
            -P 随机端口映射 
            -it (交互式的命令操作)  
            -v 数据库挂载(宿主机和容器空间的映射 )   

docker save  #导出镜像
docker load  #导入镜像
docker start   #启停容器
docker stop   
docker login   #登录dockerhub
docker commit  #提交本地容器记录,保存为一个新的镜像
docker build .     #打包构建docker镜像
docker run --name 容器的名字    运行的镜像名

语法是: docker tag 仓库名 yuchao163/仓库名

docker tag 5e0 yuchao163/s19-centos-flask  #.修改镜像的名字
 
#推送docker image到dockerhub
docker push yuchao163/centps-cmd-exec:latest

#删除本地镜像,测试下载pull 镜像文件
docker pull yuchao163/centos-entrypoint-exec

容器:

增删改查

docker run  镜像名字/镜像id     #运行docker镜像,生成容器记录
docker run  不存在的镜像名   #会先docker pull下载这个镜像,然后在自动运行 

docker container ls    #列出当前机器的所有容器(正在运行的容器,正在 运行的docker进程 )
docker  ps   #查看docker进程,docker容器记录的(正在运行的)
docker ps -a  #查看docker所有的进程,以及挂掉的进程
Docker ps -aq  #列出所有id

运行一次镜像,就会生成一个容器记录
docker容器必须有正在运行的进程,否则容器就会挂掉

docker  rm  容器id/容器名   #删除容器记录(只能删除挂掉的容器记录)
docker rm `docker ps -aq`   #一次性删除所有docker容器记录,只能删除挂掉的记录 
   
docker logs  容器id    #查看容器内的日志信息 
docker logs -f  容器id  #实时查看容器的日志 
docker exec -it  容器id   /bin/bash   #用exec指令,进入到容器系统内
    -i  交互式的shell命令方式
    -t  开启一个终端,去运行
docker exec  -it  容器id   /bin/bash  # 进入一个已经在运行的docker容器中
docker run -it ubuntu  /bin/bash      #交互式的运行ubuntu容器,且进入容器空间内

cat /etc/os-release #查看版本信息

退出docker容器空间,然后提交这个容器,生成一个新的镜像文件

语法:docker commit 你想要提交的容器id 你想创建的镜像名

提交自定义的docker镜像 如何自己打包镜像,让其他人使用

1.准备一个centos的docker容器,默认是没有vim的
docker run  -it  centos   /bin/bash  #创建启动一个docker容器,且是centos系统的

yum install  vim -y     #下载 vim 
2.退出docker容器空间,然后提交这个容器,生成一个新的镜像文件
docker commit  你想要提交的容器id  你想创建的镜像名

3.查看你创建的镜像
docker images   

4.导出你提交的镜像,成为一个压缩文件
docker  save  yuchao163/s19-centos-vim  >  /opt/myimage.tar.gz

5.把这个压缩文件,传递给其他人,其他人导入这个镜像文件,然后运行,默认就携带了vim编辑器
docker load <  /opt/myimage.tar.gz

6、  检查你导入的镜像
docker images 

7.  交互式运行切进入
docker  run -it 镜像id  /bin/bash    就创建了一个新的容器

运行一个web内容的docker容器

docker run -d -P training/webapp python app.py
-d  后台运行
-P  大写的字母p参数,意思是随机映射一个端口

在后台运行docker容器

docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done"          
#每秒打印一次hello centos 
-d daemonize 后台运行的意思 
centos  指定一个镜像去运行
/bin/sh   指定centos的解释器
-c  指定一段shell语法

指定端口映射关系

docker run -d -p 8888:5000  training/webapp python app.py
-p  宿主机端口:容器内的端口 

由于重启了docker,所有的容器都挂掉了,还得重新再运行一下docker私有仓库

Docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
-d  后台运行
-p 端口映射
-v 数据卷挂载
 --privileged=true    #设置特权运行的容器

dockerfile的学习

dockerfile作用是自定义一个docker镜像
每一个应用程序运行,必须得有一个系统作为载体
定义以哪一个基础镜像去运行docker容器

FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
FROM centos #使用base image
FROM ubuntu:14.04 #带有tag的base image

LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
LABEL maintainer=“yc_uuu@163.com"   #告诉别人,这个dockerfile是谁写的

#RUN 万能的指令,去执行你输入的命令 
#对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
RUN yum update && yum install -y vim \
Python-dev #反斜线换行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”

WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
WORKDIR /test #如果没有就自动创建
WORKDIR demo #再进入demo文件夹
RUN pwd     #打印结果应该是/test/demo
ADD 和 COPY

ADD指令用于把物理机上的文件,添加到容器空间内,并且还有解压缩的作用
COPY指令的作用,是吧物理机的文件,拷贝到容器空间内,仅仅一个作用
ADD与COPY

  • 优先使用COPY命令
  • ADD除了COPY功能还有解压功能
ENV

环境变量,尽可能使用ENV增加可维护性

rabbitmq

含义:rabbitmq是一个消息代理,他接收,存储和转发消息(邮局)

1.对消息队列进行授权,可以读写

rabbitmqctl set_permissions -p "/" heiheihei  ".*" ".*" ".*"

2..设置用户为管理员权限

rabbitmqctl set_user_tags heiheihei administrator

3..创建rabbitmq的登录账号密码

rabbitmqctl add_user heiheihei 123
(可以 netstat -tunlp 看一下端口 15672,在地址栏输入地址:15672,可以访问了)

作用:

1)程序解耦
2)数据冗余,例如rabbitmq的ack机制,消息确认机制
3)削峰能力
4)可恢复性,就算系统中部分组件挂掉,消息在队列也不丢失,待组件恢复后继续处理消息。
5)异步通信,如发红包,短信等流程丢入队列,可以优先级很低的去处理

ACK 机制

no_ack=True
不确认机制,不需要给服务端一个确认回复,服务端直接标记消息清除,从队列中删除

no_ack=Flase
确认机制,你消费走了数据,还得给服务端一个确认回复,让服务端可以正确的标记消息清除,保证消息不丢失

队列的持久化

背景:默认队列不支持持久化,rabbitmq重启之后,所有队列丢失
实现rabbitmq持久化条件
delivery_mode=2 #实现消息的持久化,重启后,队列和消息都不丢失
使用durable=True声明queue是持久化

salt 命令

salt-key -L #列出所有主机的秘钥信息
salt-key -a  秘钥id  #接受一个秘钥id
#常用参数
-L  #查看KEY状态
-A  #允许所有
-D  #删除所有
-a  #认证指定的key
-d  #删除指定的key
-r  #注销掉指定key(该状态为未被认证)

RPC远程过程调用

将一个函数运行在远程计算机上并且等待获取那里的结果,这个称作远程过程调用(Remote Procedure Call)或者 RPC。 RPC是一个计算机通信协议。

定时任务

crontab是用来定期执行程序的命令

crontab -e
crontab -l

参数
-e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI
-l : 列出目前的时程表
在以上各个字段中,还可以使用以下特殊字符:
"*"代表所有的取值范围内的数字,如月份字段为*,则表示1到12个月;

"/"代表每一定时间间隔的意思,如分钟字段为*/10,表示每10分钟执行1次。

"-"代表从某个区间范围,是闭区间。如“2-5”表示“2,3,4,5”,小时字段中0-23/2表示在0~23点范围内每2个小时执行一次。

","分散的数字(不一定连续),如1,2,3,4,7,9。

注:由于各个地方每周第一天不一样,因此Sunday=0(第一天)或Sunday=7(最后1天)

每天上午8-11点的第3和15分钟执行command:

3,15  8-11  *  *  *  command

每隔2天的上午8-11点的第3和15分钟执行command:

3,15  8-11  */2  *   *  command

每周六、周日的1 : 10重启smb

10  1  *  *  6,0  /etc/init.d/smb restart

2>&1 代表什么
代表 错误重定向到标准输出

例 :*/1 * * * * /usr/local/php/bin/php posts.php >> /data/logs/audit_bbsposts.log 2>&1

0表示键盘输入

1表示屏幕输出

2表示错误输出
">"就是输出(标准输出和标准错误输出)重定向的代表符号
重定向> 若有文件则清除原来数据,重新写入;没有则创建并写入;
重定向>>若有文件,则在文件末尾继续写入;没有则创建并写入

command >out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。2>&1 是将标准出错重定向到标准输出,
这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个& , 是让该命令在后台执行。
试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出.

awk用法

https://www.cnblogs.com/kingsonfu/p/11475618.html

posted on 2020-03-05 17:26  xm微微一笑  阅读(136)  评论(0编辑  收藏  举报

导航