教大聪明学Linux
Linux基础
1、环境的搭建
1) 下载Linux镜像后,安装VM虚拟机,激活请进行百度“VM版本激活码” 来获取激活码,比如“VM16PRO激活码” ,安装-激活VM后创建虚拟机 ,最小安装请在安装界面时就点击“这个”
2) 使用“MobaXterm” 连接CentOS
首先下载“MobaXterm” 然后使用“ip addr”使用获取IP,使用“SSH”方式输入IP连接
3) 中文模式:帮助文档改为中文与命令提示,点击查看教程
2、在Linux上安装软件或服务:
现在最主要的发行版本是“红帽”的CentOS与"debian"的ubuntu,用作服务器的就是CentOS, 在Linux上安装软件或服务只有两种“源码包”与“二进制包”,二进制在window上就是.exe, 但在Linux红帽发行版本是.rpm,debian发行版本是.deb ,但在Linux上如何单纯地用二进制包安装,会有依赖问题。即你安装一个.rpm,可能这个rpm要依赖其它的.rpm,但又没有。此时你要安装的.rpm就安装不了。而包管理器就可以解决这个问题,当然红帽、debian的包管理器不是同一个。红帽是yum,即使用yum命令,而debian是apt-get或apt(代替apt-get).包管理器是一种在线安装的方式,通过网络向远程仓库获取二进制包,进行安装,可以解决上面据说的依赖问题。
两种安装方式安装的选择,源码包比二进制包更好,体现在性能、源码可见。但需要自己手动编译安装。两种方式如何选择呢,如果要安装给外部多人访问的具有服务性的,最好选用源码包的形式进行安装,如果是个人使用,比如播放器等,推荐使用二进制的方式,因为这样更方便。
1)CentOS包管理器安装:
下载加速设置:默认是外国的源,一般先备份原生yum源,再替换为第三方的(国内)
加速(替换远程仓库的地址):
#yum 的仓库源在 /etc/yum.repos.d 目录下默认yum唯一生效的源是/etc/yum.repos.d/CentOS-Base.repo,这是由配置.repo文件内部决定是否生效的。所以替换的话。 只需修改生效的源改变后缀即可,然后再下载其它源放在该目录下即可。
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.back #移动式重命名文件
wget -O /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-6.repo #下载.repo文件到/etc/yum.repos.d/目录下
命令:
yum install/update/remove vim #安装vim文本编辑器,自带vi编辑器
2)源码包安装
环境:gcc 即:yum -y install gcc
一般步骤是:去官网下载源码包(tar.gz、tar.bz2、..) ——> 解压进入——>"./configure --prefix 安装路径" ——> make ——> make install
在报错时,执行“make clean”进入清扫,执行make install命令之后报错时,不但要执行“make clean”命令,还要删除掉安装目录
3、学习常用命令
(在Linux上一切皆文件)
详细:
❤️ 常用的目录还有:
/lib/systemd/system/*.service #目录下面是服务(.service)文件
/etc/profile #对所有用户都生效的“环境变量”配置文件
~/.bashrc #只对当前用户生产的“环境变量”配置文件 点击查看境变量配置示例
...
❤️ 常用命令:
pwd #查看当前所在位置绝对路径
mkdir note #创建一个"note"的文件夹,note还可以是一个路径 /tmp/note如果不存在会创建,但不会创建多及目录
cd note #进入当前目录下的note文件夹, note可以是个路径比如/dev/sdb5
ls -a #列出当前目录的内容
ll #列出当前目录的内容及属性,请问"ls"与“ll”的区别是?
1)d代表是文件夹, “-”普通文件、“d”目录、“l” 代表是一个软链接
2)rwxr-xr-x 其它就是rwxr-xr-x 分别是文件或文件夹所属者、所在组用户、其它组用户 分别拥有的对该文件的权限,r是读w是写x是执行
3)2 文件数
4)root root 是所属的 用户 组
5)21 文件大小
✳️如何修改权限?(重要)
chmod a+rwx 大聪明专区文件夹 #a代表所属者(u)、所在组用户(g)、其它组用户(o) 三者, 代表给全部类型的用户添加rwx三种权限
假设用4-2-1代表r-w-x,那么我们想设置文件的权限为r--rw-rwx 就可以用467即可,所以第二种方式可以用数字来代表要设置的权限
chmod 777 大聪明专区文件夹
✳️文件与文件夹的默认权限
#需要想看用户的 nmask值,然后文件最大权限是666,即创建的文件权限是666-nmask值得出; 文件夹最大权限是777,即创建的文件夹默认权限是777-nmask值,得到。
✳️如何修改所属? (重要)
首先要知道如何创建一个用户及组 :groupadd mysql #创建一个mysql组 useradd -g <组名> <新用户> #创建一个用户 groups user1 #查看user1所属的组
chown <用户>:<组> 大聪明专区文件夹
✳️如何设置ACL权限?
# 什么情况下使用ACL权限?平时的权限就是所属者、所属组用户、其它用户权限,所以我们就会遇到一种问题,在上课,会用到文件分享等,老师是所属者rwx,学生是所属组rwx,其它班级不应有任何权限,但如果有一个暂时来学生(listen)来听课。我们要于的权限是rx, 这样我们就实现不了,所以需要用到ACL权限,比如“/www”目录是共享文件:
setfacl -m u:listen:rx -R /www #给现已存在的/www目录及内容文件listen用户ACL权限为rx
setfacl -m d:u:listen:rx -R /www #给于listen用户ACL权限为rx,d是默认在在文件夹下以后要创建的文件都有rx权限,注意除了是“u”,还可以是"g"——组
getfacl /www
setfacl -b -R /www
✳️sudo 权限
visudo #编辑sudo权限
root ALL=(ALL) ALL #(第一个ALL指网络中的主机;第二个ALL指目标用户,以谁的身份运行命令;第三个ALL指命令名)
touch test.sh #创建一个文件
vim test.sh #使用vim编辑器编辑test.sh文件...
“a” 切换编辑模式(刚进入是查阅模式)
“Esc” 切换为查阅模式
“Ctrl+F” 下一页, "查阅模式"
“Ctrl+B” 上一页, “查阅模式”
"/大聪明" 在查阅模式下查找“大聪明”,满足的内容会高亮显示
":set nu" 显示行号
“:wq!” 保存并退出
“:q!” 忽略更改,强制退出
":! cmd" 执行cmd命令,, 暂时退出vim,回车回来
":r ! cmd" 将执行cmd命令的输出变为输入
":map ^p I#<ESC>" Ctrl+P在行前自动插入,更多请自行学习, 长期:vim ~/.viminfo
":ab myemail 21192nnnfs@163.com" #文字替换,使用输入“myemail” 回车就变为了 21192nnnfs@163.com, 长期:vim ~/.viminfo
"vim -O file1 file2" #左右编辑file1与file2文件,上下小写o, 长期:vim ~/.viminfo
"gg" 转到文本第一个字符
“shift+g” 转到最后一个字符
“shif+^/$” 转到行首行尾
cp -r bb cc #文件夹:将bb文件夹及里面的所有文件{ 如果cc不存在复制成为cc | 如果存在复制到cc目录下,此时cc下有bb }
mv bb cc #与cp一样,只不过这是移动,源文件会消失。 除此还可以用来对文件或文件夹的重命名
rm -rf 删库跑路 #删除文件或文件夹,是直接删除的,这就是“删库跑路” ,rm -r 是有提示的,但文件是一个个删的,文件比较多就很麻烦
ln #创建链接(软链接、硬链接)
ln -s <源文件或文件夹> <将由哪个文件夹或文件冒牌> #创建的是一个软链接(快捷方式)
ln <源文件> <目标文件> #创建一个硬链接(不常用),注意目标文件是一个真实的文件,它的信息与源文件同步更新
🤔问题:硬链接权限区第一个字符是“l” 吗?
✳️ 文件或文件夹的颜色表示的意义
tar #解压、压缩命令
在Linux上,.tar.gz、tar、 tar.xz 是常见的压缩包
tar -zxvf mysql.tar.gz #解压 -xvf=默认=智能解缩(未认证)
tar -zcvf mysql.tar.gz mysql #压缩命令, 将mysql 文件夹压缩成mysql.tar.gz -cvf=默认=-zcvf
tar -ztvf mysql.tar.gz mysql #查看不解压
如果是zip, 需要安装使用到zip与unzip
unzip test.zip #解压zip文件
zip -r test.zip test #压缩成zip文件
左边的输出 | 右边作为流入 #管道符
cat 小说.txt #打印文本
cat 日志.log | grep 运行成功 #列出匹配成功的行
lsof -i:80 #查看80端口被哪个程序占用
kill -9 PID #根据进程的PID杀死进程
ip addr #查看ip ,还有一种方式 “ifconfig”
ps -ef | grep java #“ps -ef”列出所有进程信息,通过管道符“|”交给grep处理
find /usr/local -name mysql #从根目录下搜索mysql
tail -f /tmp/run.log #默认输出最后10行,并进行监听文件的增长情况,比如该文件新追加了一行信息,它也会跟着输出,直到你按Ctrl+C
md5sum mysql.tar.gz #计算和校验文件的MD5值
firewall-cmd --zone=public --add-port=80/tcp --permanent #永久开放80端口
firewall-cmd --reload #开放了端口,需要重启防火墙
crontab #定时任务
crontab -l #查看定时任务,每一行代表一个定时任务
crontab -e #修改定时任务 " * * * * * cmd " 分别是分钟、小时、天 、月、周
示例:每一天的8:00 : 00 8 * * *
每月的第1天与第5天: * * 1,5 * *
第每的第1天到第5天: * * 1-5 * *
alias root="ls -l /" # root命令等于ls -l / , 示例2: alias ll="ls -l" ll / 等于ls -l /
#但这是临时的,如果是永久,那么需要将该命令追加环境变量中占用一行,然后“source 环境变量配置文件”
mount #挂载
iso挂载: mount /dev/sr0 /mnt/iso 卸载:umount /mnt/iso 或umount /dev/sr0
USB挂载: mount -t vfat -o iocharset=utf8 /dev/sda1 /mnt/usb #以-t指定挂载分区的文件系统,可以写到“auto”自动识别文件系统 -o中文不乱码,还可以指定挂载后的权限,比如只读 卸载:方式不变
挂载windows盘: mount -t ntfs-3g /dev/sda1 /mnt/windows #注意可以不支持ntfs-3g,原因应该是没有对应的驱动
上面的操作是临时的,如果想要永久修改: 要编辑 /etc/fstab,改错,系统起不来!!,可以用 "mount -a" 检测,但不完全靠谱
分区知识: 一个硬盘的格式有两种,MBR与GPT,MBR格式决定了一个硬盘最多只能分四个分区,可以是主分区(存储数据)、与扩展分区,因为最多 只能有四个分区,所以我们需要创建扩展分区,创建扩展分区后,该扩展分区序号为5,第一个扩展分区必为5。后面我们创建的主分区是建立在扩展分区上的,改名为创建逻辑分区(l),且MBR决定了每个分区最大为2T。而GPT可以说几乎没这些限制。所以我们在分区GPT时,没有创建逻辑分区这个选项。
fdisk /dev/sda #该命令用于给MBR格式硬盘分区。 分区流程如下图: 创建分区, a代表第一个sd盘,一个盘最多分四块,每一块可以是存储分区或扩展分区, 注意创建扩展分区后,l是p,一样的l是逻辑分区,是建立在扩展分区上的存储分区 ,视频教学:https://www.bilibili.com/video/BV1ut411a7ro?p=93
t #可以手动改变分区格式,l能列出分区情况
parted /dev/sda #该命令用于给GPT、MBR格式硬盘,进行分区。使用方法与“fdisk” 差别不大。
help(或m) #帮助
print(或p) #对应fdisk里面的p,可以 p回车补全。
mklabel GPT #改变硬盘的格式为GPT,注意这会使硬盘的内容全部丢失。
mkpart #创建一个分区,注意现在的parted只能创建ext2 ,其它格式需要退出parted使用mkfs来进行格式化
rm #删除分区
quit #退出parted
mkfs -t ext4 /dev/sdb1 #分区格式化,分好后需要格式化才能使用
mount /dev/sdb1 /tmp/ssb #挂载
vim /etc/fstab #自动挂载 ,注意这个文件不能乱修改 /dev/sdb1(要挂载的分区) /disk1(挂载为目录,挂载后,该目录文件暂时不可见) ext3 defaults 1 2
#修复由于修改/etc/fstab 文件发错而导致的无法启动,在启动报错页面-> 输入密码root -> 修改 / 根挂载的权限为rw , “ mount -o remount,rw / ”,因为此时是读,无法保存修正 -> 去修正 -> 重启
df -h #查看分区使用情况,及挂载位置
du -sh ./mysql.tar.gz #查看指定文件的大小
swap交换分区 # free -h不仅能查看我们的内存还能查看交换分区,交换分区当我们内存使用完后或一定量后,能开始使用我们的交换分区,如果边交换分区也使用完了,不要慌,我们可以来加,即创建一个swap分区,然后格式-挂载即可。
1、创建一个主分区后,我们 l 查看所有的格式的序号,用 t 改变分区格式为swap
2、mkswap /dev/sda2 #格式化sda2 swap分区
3、swapon /dev/sda2 #挂载指定 swapp,此时free -h 就可以查看我们的swap大小改变了
4、vim /etc/fstab #加入自动挂载
4、swapoff /dev/sda2 #卸载指定 swap
shutdown -h 5:00 #5:00关机, 示例2:shutdown -r now #立即重启
-h #关机
-r #重启
-c #取消已执行shutdown命令
注意:shutdown是安全的是最建议的,reboot也是安全的,但使用halt关机是不安全的,不建议使用
nohup cmd > file 2>&1 & #如果执行命令,它会占用shell,Ctrl+C又会将程序kill掉,这里就需要将它放在后台运行了,且把错误信息同正确输出。
磁盘配额 #限制用户或组在一个分区中存储的文件大小或i节点, 内容:略
LVM #逻辑分区
5、快捷键加快效率
基本的:Tab补全、Ctrl+c强制终止正在运行的命令
常用的:alt+y粘贴、ctrl+a 回到命令前、ctrl+e回到命令尾部、ctrl+u删除当前行命令、ctrl+l清屏
6、shell脚本基础:
概述: 要linux上的shell是base, 现在的sh也变为了base, 而苹果Mac上是csh.shell编程是最简单的编程,它不需要考虑效率问题,一般就是自己使用的。简化工作的。
脚本 : 脚本就是由Shell命令组成的文件,这些命令都是可执行程序的名字,脚本不用编译即可运行。它通过解释器解释运行。
1)在if或for都是需要判断的,注意:首先需要知道:
""与'' , 字符与字符中变量 单引号代表里面的内容都是字符串,不需要解释变量。 双引号相反,有变量就进行替换比如"输出$a"
[[ 与 [ 的区别是? 逻辑判断 [[ 恐怖如斯,但[功能比较少,与或非逻辑运算是不支持的
``与$() 命令替换 主要是用于命令替换或说子命令或说子查询;嵌套用法`cmd1+\`cmd2\`` , $(cmd1 $(cmd2)) 示例:echo `ls -n \`echo "/tmp"\` | grep www`
$变量 与 ${} 变量替换 比如有个变量a,怎么输出? $a 或 ${a}
${} 的特殊功能,${xv:0:5} 对xv变量字符串,进行截取0索引到5索引、 ${xv:-3} 截取倒数后三个字符
2)判断分为几个类型的判断! [] [[ ]]
实体判断
-d dir 判断文件夹是否存在
-f file 判断file文件是否存在且为普通文件
-r/w/x file 分别判断当前用户下是否可读、写、执行
数值判断
A -eq B 相等
A -lt B 小于
A -gt B 大于
A -le B 小于等于
A -ge B 大于等于
A -ne B 不等于
字符判断(注意空格)
'A' == 'B' 等于
'A' != 'B' 不等于
3)如何在运行过程中输入数据?
read o
或
echo "检测到你还没有安装git,需要安装吗?(y/n)"; read o
4) 如何在在执行脚本前输入数据?
./test.sh 1 2 3 #在脚本中声明了$1、$2、$3变量,值分别是1、2、3
5)如何声明一个数组?
array=( value1 value2 value3 ... ) #声明连续的元素,它们对应的索引就是 0,1,2... 访问:${array[索引]}
array[nb] = '666' #声明k-y ,读取时可以是索引也可以是key,即${array[nb]}
${#array[*]} #获取数组的长度
6)如何将字符根据某个字符进行切割成数组?
str='192.168.87.103'
OLD_IFS="$IFS";IFS="."
array=($str)
IFS="$OLD_IFS"
for i in "${!array[@]}";do
echo "$i=>${array[i]}"
done
7)如何将字符进行替换
file='-dir-dir-dir-'
echo ${file/dir/path} 将第一个 dir 提换为 path 输出: -path-dir-dir- echo ${file//dir/path} 将全部 dir 提换为 path 输出: -path-path-pathh-
8)基本结构说明
#!/bin/bash #声明使用什么什么解释器运算该脚本,当前是bash,除此还有sh,bash兼容sh,同时sh是bash的一个软链接 # 判断结构 if [ -d '/tmp/www' ];then
echo '文件存在!' elif [[ `ls -a /tmp | grep www | wc -L` > 0 ]];then
echo '我看了,文件真的存在!'
else
echo '我看了,文件不存在!' fi #循环结构 for val in 1 2 3;do echo val done
echo "Hello,world!"; #你可以使用echo 输出, 如果想要不换行输出 “-n” ,如果要输出十六进制数或输出具有指定颜色的字要使用"-n"
echo -n "不换行";
echo -e "\u8f93\u51fa\u5341\u516d\u8fdb\u5236"; #输出十六进制 ,你可以进行Unicode与中文互转 16进制
echo -e "\e[1;32m 成功! \e[0m"; # 32代表绿色,31是红色
运行shell脚本: 赋于执行权限(chmod 777 ./test.sh) 直接运行./test.sh ,或bash ./test/sh 运行
history #shell历史命令,查看当前用户下的历史命令,即cat ~/.bash_history ;-c 清空 -w 将缓存中的命令写入到文件,除此还可以对历史命令进行更多操作
source /etc/profile #或 “. /etc/profile”, 重新加载这个文件的shell命令
>> 与>与 < 与<< #向右的是输出流,向左的是输入流;
ls / >> /tmp/run.log #将ls /命令的输出以追加的方式保存在 /tmp/run.log文件中,如果要覆盖是“>” ,注意这保存的是命令成功的执行命令才存到, 如果你执行了一个不存在的命令,会报错,此时是直接在控制台输出的,而不是保存在文件中,如果不管怎样都不存在什么信息都输出在文件中,可以这样“ls123 >> /tmp/run.log” 2>&1 " 或 “ls123 &>> /tmp/run.log” ”, 如果想执行存在的命令与执行不存在的命令分开保存,可以 这样“ls -a >> /tmp/run.log 2>> /tmp/run.err.log”
输出 | wc -L #wc命令的功能为统计指定文件中的字节数、单词数、行数, 并将统计结果显示输出
-l, --lines 打印行数
-L, --max-line-length 打印最长行的长度
分号“;” #可以一行执行多个命令如: “ ls / ; date ” 他们互不影响
&& 与 || #是逻辑运算,&&当左边OK时,右边才会执行,|| 是当左边不OK时右边才执行。 运用模拟if语句: ls123 && echo yes || echo no
grep 与find #grep是查找字符串的,而find是查找文件名的,所以find可以用来查看文件 find / -name "java"
特殊符号: ' ' 单引号时里面的内容就是单纯的字符;“ ”双引号时,里面可以是变量 $变量名、$(命令)或`命令`
bash #当我们执行base时,会在当前bash开一个子bash, (cmd) 括号中的命令是在子bash中执行的,而{cmd} 则是在当前bash下执行的。区别是不同bash程序下,声明的变量是不通的
# #是脚本的注释
\ #是转意字符 echo "$v" 这样会输出变量v的变量,但如果是echo "\$v"则输出 $v
赋值 #我们在赋值时,“=”号两边是不能存在空格的,且如果值是字符且中间有空格,那么一定要用引号 name="小 庄“ 而不能是name=小 庄
变量的分类 #变量分为 用户自定义变量、环境变量(用户自定义、系统自带)、位置参数变量 、预定义变量 ; 环境变量名介意使用大写
环境变量 #set可以查看环境变量,但不全,而env可以查看几乎全部的环境变量,但只能查看系统自带的环境变量
set 变量名=变量值 #变量的声明
set -u 再输出变量时,若该变量 不存在会报错,不执行它前没有时只输出一个空行。
export 变量名=变量值 #用来声明一个环境变量,特点是bash共用的变量
PATH 环境变量是系统自带的环境变量,是系统查找命令的路径
PSI 可以修改命令提示符 “ zhuangjie@zhuangjie-WRT-WX9:~/note$ ” 的显示的格式
LANG 是系统的环境变量,可以查看当前使用的语言
locale 查看已安装的语言
位置参数: 向脚本中传参,如“ ./start.sh 11 22 33 44 ” 我们可以在脚本内使用 $1 $2 $3 获取(超过9指定使用${ }),#*可以查看全部参数, $#是参数个数,#@ 以一个一个的方式输出,可以用来遍历。
$(( )) #用于数学运算 ,而$( ) 放的是命令
预定义变量: echo $? 可以输出上一次运算是否成功,0代表无错误运行。 echo $$ 可以输出当前进程的PID; $!代表后台运算的最后一个进程
read -t 30 -p "请你输入第一个数字:" num1 #可以输让脚本进行输入数据。 -h 指定字符数、-s 隐藏 -t等待时间 -p 提示输入
declare #声明有数据类型的变量,我们在声明时环境变量时用的 export 是declare的简写,可以用来声明环境变量,declare -x k=v 而查询: declare -p PATH
一个计算器的shell示例:
#!/bin/bash read -p 'one num1:' num1 read -p 'operator:(+/*\):' operator read -p 'num2:' num2 [ "$operator" == "+" ] && echo $(( $num1 + $num2 )) && exit [ "$operator" == "-" ] && echo $(( $num1 - $num2 )) && exit [ "$operator" == "*" ] && echo $(( $num1 * $num2 )) && exit [ "$operator" == "/" ] && echo $(( $num1 / $num2 )) && exit echo "Error!"
变量测试 # x=${name=新值} 如果name变量没有值,"新值"就是x的值,如果有name的值就是x的值,根据x的值判断name的值。
环境变量加载顺序:
ssh登录欢迎信息: /etc/motd 通过在这个文件中加入欢迎语句,我们在登录时就会显示。 From woner : This is zhuangjie's pc,illegal user Please exit now!
ssh 本地六大终端的登录提示信息: 修改 “/etc/issue” 文件
stty -a #查看快捷键,也可以修改,比如 stty iner ^p ,意思是Ctrl+p强制退出。
grep 是用来筛选行的。我们可以通过正则匹配到想要的行。grep的使用方法放在下面的正则部分
自启动:如果想写在系统固定执行文件,vim /etc/rc.local ,如果想创建自启动文件: vim /etc/profile.d/<脚本名>.sh
基础正则:
grep "a" file #这样是说查出包含"a"的一行。 如果我们要找出至少2个"a"的一行呢,那就是 grep "aaa*" ,引出了“*” 意思是*前面的一个字符含有0个或多个; 还有比如 grep "saa*id" file 是找出s-id之间必须含有一个a, 那么我们叫s与id是限位符; 更多:
[a-z] 代表一个多形态的一个字符, [A-Z] [abc]、[0-9] 、 [a-zA-Z] 特别的[^a-z]代表除小写字母后的其它字符。
. 点是代表任意一个非换行符的字符
限位符: ^开头 $结尾
a\{3\}: 代表三位a字符,特别的,如果没有限定符跟 a\{3,\} 是一样的效果代表的是3位或多于3位的a, 所以^a\{3,6\}$ 则是找出含有a到6位的a的一行
\ 是转意的意思
grep -v "root" file #取不含root的行,-v是取反的意思
示例: grep -v "root" /etc/passwd | grep "/bin/bash" #找出可以登录ssh我们创建的用户
扩展正则: + 一个或多个 ?0个或1个 ()与 | 一般一起用,如下示例,扩展正则是完整的正则在使用时使用egrep或grep -E 正则 file
匹配IP的正则示例: grep -E "^((1?[0-9]{,2}|(2[0-4][0-9])|(25[0-5]))\.){3}(1?[0-9]{,2}|(2[0-4][0-9])|(25[0-5]))$" ips.txt 实质只是 1?[0-9]{,2}|(2[0-4][0-9])|(25[0-5])) ,而它是由第个块范围是0-255 , 即百十个位
0 0-9 0-9
1 0-9 0-9
2 0-4 0-9
5 0-5
cut 提取列: cut -d "," -f 2,3 file ,提取file文本中第一行以“,”作为列的分隔符, 提取出2,3列。 除此 -c 2-3 可以提取每行的第2-3 字符。有明显的一些缺点,无法以空格+ 作为列分隔符
awk #当我们cut无法解决时,我们需要使用便强大的工具了,awk 可以筛选行&筛选列。awk也算是一门编程语言,很多结构都有。而我们要掌握的就一点即可。
df -h | awk 'BEGIN{FS=" "} $6 ~ /\/$/ {split($5,arr,"%");printf arr[1] "\t"} END{print "\nexec done!"}'
这是awk比较完整的写法,其实我们可以简化我们需要掌握的东西,
BEGIN是在整体处理之前执行可以用来指定分隔符,而我们也可以通过“-F” 来指定分隔符。END是处理完后执行,非常少用;
NR是当前行,NF是当前列,FS指定分隔符, $0是当前处理的行、$n是当前行的第几列这些都是内置变量;
printf不换行,需要“\n”来换行,注意字符需要用双引号括起来,print自动换行。
$3 ~ /正则/ 通过当前行的指定列来匹配行,/正则/ 通过当前行来匹配行;
故可简化为:
df -h | awk -F ' ' ' $6 ~ /\/$/ {split($5,arr,"%");print arr[1] "\t"}' #以空格+为分隔符,以当前前的第6列来匹配行, 对匹配的行的第5列以“%”作为分隔符,得到数据arr,然后输出arr[1]
sed #可以对文本文件或字符串进行““增删改查”,不管是哪种操作都是先匹配行,然后再进行操作。 -n 是取消默认输出、-r是可以使用“扩展正则”, -i 如果操作的是文件就保存更改到文件。单引号中的p是匹配输出、a、i 加入行,c、s是替换操作。
... | sed -n '3p' #该命令是输出第三行, n是取消默认输出,r是识别正则。 进行字符串或文件文件的“增删改查”
... | sed -n '1,3p' #输出第1~3行,共三行。当然1,3也可以是正则,可以行号与正则混用
... | sed -nr '/8:00/,/9:00/p' #输出8:00~9:00的内容,注意这里使用的是正则。 原理是先找到第一个,找到后开始输出,然后找第二个正则,找不到会一直输出。
sed -i '/error/i 99' test.sh #在/error/ 匹配成功的行前加入一行内容为"99“ 。 a是行后加入一行内容 ,i是行前加入一行内容。
sed -i '/匹配行/s/被替换的字符/替换的字符/g' test.sh #进行字符替换,且保存修改
netstat -lntp #查找打开的端口
运行级别: 有七种运行级别,切换命令是init 0~6 , 如何要默认启动指定的运行级别,修改"/etc/inittab" 文件即可。注意可不能把0与6级别写入否则,开机就关机/重启。
- 0 停机,关机
- 1 单用户,相当于window的安全模式,无网络连接,不运行守护进程,不允许非超级用户登录
- 2 多用户,无网络连接,不运行守护进程
- 3 多用户,正常启动系统
- 4 用户自定义
- 5 多用户,带图形界面
- 6 重启
自执行脚本: 在进入命令行前,会自动执行 /etc/rc.local bash脚本文件,这是软链接,引用的是/etc/rc.d/rc.local 文件。我们可以将服务放在/etc/rc.d/init/下,开机也会自启动。
Linux的系统引导:有二种旧的是Lilo,新的是grub , 配置文件是 /etc/grub.conf => /boot/grub/grub.conf 我们可以通过修改这个文件来修改系统启动时等待时间,默认启动的系统。在等待进入系统那个界面我们可以进入安全模式,进而修改密码,不过这都要我们有主机的情况下。在这个界面我们只需按"e" ,然后修改启动为1,安全模式启动(临时生效)。然后直接进入安全模式即可。如果在加密了,即在 /etc/grub.conf 配置了 password -md5 ... 时。先p验证完密码后才能e。修改密码是passwd 用户名 就可以了。忘了密码除了安全模式外,还有光盘修复模式可以修改密码。
服务管理:RPM包与源码包的服务是在不一样的地方的。
1)RPM包启动脚本是放在指定位置由指定命令管理的,而源码包是安装的位置的。而启动脚本是执行了"/usr/sbin/"下对应的脚本 。除了独立的服务,还有基于xinetd 的服务管理,而xinetd也是独立服务的一个服务,下面说的是独立服务
centos6 “/etc/rc.d/init.d/*.service start” 使用的是“service”管理的。格式是“ service * start|stop|status ”,而自启动命令“chkconfig --list”查看可被管理自启动的脚本,“ chkconfig <服务名> on ” 就开启指定服务启动服务,能被chkconfig管理是因为脚本中有“# chkconfig: 35 86 76\n# description:备注信息”。而图形界面管理命令是“ntsysv”
centos7 放在 "/lib/systemd/system" , systemctl管理命令,语法格式是“ systemctl start|stop|status *.service ” ,同样可以用"ntsysv"图形界面管理(空格选中或取消、tab跳在下面)。
2)源码管理管理:管理脚本是放在官方指定的文件的,放在与安装位置相关的位置上。如果想要自启动,把启动命令放在“ /etc/rc.d/rc.local ”下,这是一个bash脚本,会在输入命令登录前执行。如果想要把源码包像rpm包一样被管理,需要将启动脚本设置软链接到服务管理的位置, 比如systemctl的“/lib/systemd/system” ,且修改文件软链接文件,在#!/bin/sh 下加入二行 “# chkconfig: 35 86 76\n# description:备注信息”, 然后 "chkconfig --add" 给chkconfig管理。但这就是service ,systemctl不适用。chkconfig * on 会转发到命令是 ”systemctl enable * “。
服务优化: 是将不必要的服务关闭,比如蓝牙服务。
进程: ps aux 可以查看进程, top -b -n 1 是top的一次输出。ps -le 可以查看服名式的服务,而"killall -9 服务名"
杀服务: kill -9 服务PID #我们可以查找lsof -i:80 可以查看80端口占用的进程。pkill -9 -t 用户up , w可以查看
放入后台: “命令 &” 放在后台运行(后台运行状态),在运行时可以使用Ctrl+z 放在后台暂停运行, "nobup 命令 &"放入后台,就算退出ssh。jobs可以查找后台的进程列表。”fg 工作号“ 可以恢复到前台,”bg 工作号“ 可以将暂停的后台变为运行后台。 注意vi、top放在后台都会暂停状态。
系统定时任务:
at 是一次性任务,指定的是具体时间执行, /etc/at.allow是用户白名单、/etc/at.deny是用户黑名单,两个文件的关系是,都存在白名单优先,都不存在,只能root用户使用 。使用方法是”at 17:30 2/24/2022“ 回车 命令 回车 ctrl+d 。atq 查看、”atrm 工作号“ 删除指定at定时任务。
cron 循环定时任务:"/etc/cron.allow"是白名单,“/etc/cron.deny”是黑名单 , "crontab -e” 可以写root的定时任务, vi /etc/crontab 可以写指定用户的定时任务。书写的时间格式是 "* * * * *" 对应的是"分 小时 天 月 星期",注意写天就不要写星期,如果两个都写了是并关系。
"*/10 1,2 1-15 * *" 是每月的1-15日,的1点和2点每10分执行。注意星期位0-6表示星期日到 星期六,且7等价于0都是星期日。
anacron 关机时防止任务漏掉, 执行的是/etc/cron.{daily、weekly、monthly} 文件夹下的脚本。会每天、每周、每月执行对应文件夹下的脚本。
uname -a #可以查看系统信息
vmstat 1 3 #显示系统内存信息,1是刷新间隔,3是次数
uptime #可以查看系统启动时间
/proc/* #硬件信息, cat /proc/cpuinfo 输出cpu信息, cat /proc/meminfo 输出内存信息
日志管理: 系统的日志放在/var/log/*下的文件,lastb命令可以查看登录错误信息查看的/var/log/btmp 日志文件。我们可以对 日志切割|轮替 更多内容
网络安全
ping -c 4 192.168.87.101 #探测4次是否能连接指定ip
netstat -rn #查网关 -tulnp查开启的端口
nmap -sP 192.168.1.0/24 #工具在局域网里进行侦探,查看局域网里ip存活数量
w #查看登录该主机shell 的ip用户或查看几分钟前的平均负载情况
6、实战篇
1、服务管理脚本
如果想要开机自启 || 还有执行启动命令后,如果退出就关闭时,使用脚本
vim /lib/systemd/system/*.service
[Unit] [Install] [Service] Type=simple #默认值,这个服务主要由 ExecStart 设置的程序来启动,启动后常驻于内存中。 ExecStart=启动命令 #启动 当执行 systemctl start *.service (不能接受 <, >, >>, |, & 等特殊字符,可以写在脚本中,再在这里执行这个脚本) ExecStop=停止命令 #关闭 当执行 systemctl stop *.service
systemctl daemon-reload #重新加载服务管理脚本
systemctl enable *.service #设置开机自启
systemctl is-enabled *.service #判断是否已开启了开机自启
systemctl start *.service #手动启动
2、安装实战