3天搞定Linux,1天搞定Shell笔记

2024-07-28  本文已影响0人  卡斯特梅的雨伞

Linux概述

分层示意图

image.png

开源协议

Linux发行版本

image.png

Linux安装

主机名:hadoop100
  静态IP: 
root : 123456
log:12345

模拟linux服务器

创建虚拟机

  1. 处理器数量。表示有几个cpu,有几个插槽。
  2. 每个处理器的内核数量。一个cpu有几个核心。
  3. 如果有超频技术的话,一个内核又可以超频为2个或者n个逻辑内核。(虚拟机不考虑该逻辑)
  4. 虚拟磁盘表示用文件、文件夹来模拟磁盘。
  5. 作为服务器语音选择英文,学习可以选择中文。
  6. GNOME桌面。(KDE桌面更华丽,但更损耗性能)
  7. 分盘(将一块硬盘逻辑上隔离开,物理上还是一块硬盘)
    1. window从C盘开始分区是因为A\B盘都是软盘。
  8. 创建分区——挂载点
    1. 使用标准分区
    2. /boot ,引导分区,注意挂载引导程序,1G.
    3. /swap ,交换分区。作为虚拟的扩展内存。当内存满的时候用于扩展内存交换。一般设置为虚拟内存的1-2倍大小。4G
    4. / , 默认分区,剩下的磁盘都分配到该分区。
    5. 文件系统选择
      1. ext4 ,第四代扩展文件系统。
      2. xfs ,比ext4更高性能的文件系统。
      3. swap, 交换分区专用的文件系统。
  9. KDUMP 系统崩溃后的处理功能,虚拟机没必要开启,真实服务器才需要。
  10. 创建用户设置密码。生产上不能直接使用root用户,权限太大,创建合适的用户和对应的用户权限去操作才行。
网络类型

Linux文件系统

经常使用存放的目录:

有个小箭头表示是个快捷键,真实目录位置要看详情。

image.png

VIM文本编辑器

emacs:神之编辑器,可扩展性好。

vim打开的文件是带颜色区分的,vi没有。

vim三种不同的模式

image.png

常见语法

image.png

编辑模式输入

image.png image.png
image.png

网络配置

修改静态IP步骤

1、找到配置文件路径


image.png

2、修改网络脚本配置文件,BOOTPROTO修改为static,增加IP地址,网关,DNS1,子关掩码(没有也行)


image.png

三种虚拟机连接模式

三种虚拟机连接模式.png

桥接模式:


image.png

NAT模式:


image.png

NAT虚拟了一个网卡,一个路由器,因此网卡分配.1,路由器分配.2 作为网关。


image.png

系统管理

进程和服务的区别:

一个正在执行的程序或命令,都被叫做进程(process);启动后一直存在,常驻内存的进程,一般叫做服务(service)。

centOS7保留NetworkManager,不建议使用network 服务。

服务使用语法:
systemctl start|stop|restart|status|enable|disable 服务名
enable/disable 开启/关闭 开机自启动
查看服务的方法:
/usr/lib/systemd/system
.target 表示一组服务的集合

进入设置服务是否开机时自启动:
在终端窗口敲: setup 回车,就会进入设置,选择系统服务回车
空格键可以打* ,表示自启动,tab键往下移动到退出键退出。


查看当前linux系统的运行级别:
systemctl get-default
如果是图形化界面会返回:graphical.target
设置运行级别:
systemctl set-default graphical.target

init 3 切换到3,多用户的命令行模式
init 5 切换到5,图形化界面模式


centOS 6的防火墙服务叫 iptables
centOS 7的防火墙服务叫 firewalld ,后缀d表示这是个守护进程 
防火墙本质就是一张ip:port表集合,用于校验ip是否放行的表。
防火墙的开启关闭语法与上面相同:
systemctl start|stop|restart|status|enable|disable firewalld

linux关机前需要进行数据同步sync,从内存同步到硬盘中。因为linux的预读迟写的优化操作。

关机命令


image.png

linux启动加载过程


image.png

Shell常用命令

帮助命令

#type 命令可以用于判断一个命令是内置命令还是外部命令
type cd 
type exit
type useradd 

#如果是内置命令要查看帮忙文档,则要多加一个 -f 选项
man -f cd 

#其他查看帮助命令,man命令是最全的。
man ls

#help命令只能用于内置命令的获取帮助信息,外部命令不行
help cd

#外部命令一般可以使用: --help 来查看帮助信息。
ls --help

文件目录类

 #显示当前工作目录的绝对路径 [print working directory]
 pwd
 
 #列出文件内容 [list] -a: 表示all,查看所有包括隐藏的所有文件
 ls -a 
 # -l :表示long,长数据串列出,包含文件的属性和权限等。
 ls -l  / ll
 #第一个是-表示文件,d表示这是个文件夹
 -rw-r--r--. 1 root root 1671 5月  21 23:27 initial-setup-ks.cfg
drwxr-xr-x. 2 root root    6 5月  21 23:27 公共
 
 #切换路径, ..表示上一级目录   .表示当前目录
 cd ../dev
 # 返回上一次路径所在位置,可用于在两个路径下不同地切换。
 cd -
 #cd 后面不加路径表示切换到主文件夹
 cd
 #创建文件夹 make directory,下面是在当前路径下创建文件夹
 mkdir test
 #创建绝对路径下名字叫dev的文件夹
 mkdir /dev 
 #创建指定路径下的嵌套文件夹,没有则创建对应文件夹 -p:parents
 mkdir -p /d/e/f
 
 #移除文件夹
 rmdir /dev
 #多嵌套路径下移除文件夹,不好用,还是使用rm -rf
 rmdir -p /d/e/f
 
 #创建空的新文件
 touch hello.text
 vim hello.text
 #创建指定路径下的文件
 touch /data/hi.text
 
 #复制文件或目录 cp:copy
 cp [选项] source dest
 cp hello.text /data/
 #如果复制的目标文件是已有的文件,那会提示是否覆盖该文件,y表示yes,n表示no。
 cp hello.text hi.text
 #加反斜杠\ 表示强制复制并覆盖, \表示执行原生命令,不带选项参数
 \cp hello.text hi.text
 
 #复制文件夹及其文件夹下的所有文件和文件夹
 cp -r /data/log /backup/data/log
 
 #删除 -f 强制删除 -r 递归删除
 rm [选项] deleteFile
 rm -rf /backup
 #删库到跑路
 rm -rf /*
 
 #移动文件
 mv hello.text /data
 #移动文件并重命名为hi.text
  mv hello.text /data/hi.text
 #对文件做重命名
 mv hello.text hi.text
 
 
 #查看文件内容 catch ,适用于查看内容小的文件
 cat hello.text
 #查看文件内容并显示行号
  cat -n hello.text
 
 #分屏查看文件内容  
 more hello.text
 
 
  #分屏查看文件内容 less ,跳到开头shift + G,跳到最后G
 less hello.text
 
 #查看带有别名的命令
 alias
 #出参
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
 
 #输出到控制台,-e 表示支持反斜线控制的字符转换
 echo "hello   world"
 #换行输出  
 echo -e "hello \n  world"
 #使用echo 配合 >>  追加文本或者配置到文件下
 echo "hello world" >> config.yml
 # > 表示覆盖 ,  >>表示追加到文件末尾

#查看系统环境变量 
#显示所有环境变量
echo $ 
#显示path环境变量
echo $PATH

#查看文件头部内容
head hi.text
#查看文件头部内容前200行
head -n 200 hi.text


#输出文件尾部内容
tail hi.text
tail -n 200 hi.text
# -f 实时追踪文件的更新,跟踪最后200行
tail -200f  hi.text 


#查看文件的索引号
ls -i hi.text


#创建软连接ln,也就是快捷方式 -s:soft
ln -s [文件或目录] [软连接名]
#在想要生成软连接的位置去执行 
# 属性值首字l表示这个是软连接
ln -s /data/logs mylog

#想要查看软连接对应的物理路径,使用-P
pwd -P

#删除软连接
rm mylog
#rm -rf mylog/ 注意:带后面的斜杠会把软连接对应的真实目录下的内容删掉

#创建硬连接 不加 -s,当前文件的链接数不包含软连接的数量,是指硬连接的数量。
ln /data/logs hardlog


#查看已执行过的历史命令
history
#显示10条历史命令
history 10 
#清空历史命令记录
history -c

more语法


image.png

less语法


image.png

时间日期类

#获取当前日期
date
#获取当前年份
date +%Y
#获取格式化的日期
date "+%Y-%m-%d %H:%M:%S"
2024-06-05 20:05:55

#获取当前时间戳
date +%s

#获取计算的时间,1天前
date -d "1 days ago"
#获取日历
cal

#获取当前月的前后3个月日历
cal -3
cal 2024

用户权限类

#添加新用户
useradd 用户名
#添加新用户到某个组
useradd -g 组名 用户名

#设置用户的密码
passwd 用户名

#判断当前是否有这个用户
id 用户名
id zhangsan

#查看所有系统用户
less /etc/passwd

#切换用户 su: switch user
su 用户名
su zhangsan
#切换到用户主目录
cd ~ 
#返回当前使用的是哪个用户
who am i (最外层会话是哪个用户)
whoami (当前会话是哪个用户)

#设置普通用户具有root权限,需要先给该用户添加到sudoers文件名单中
sudo ls
#修改sudoers文件
vim /etc/sudoers

#删除用户 ,用户会被删除,用户主文件夹还在  
userdel zhangsan
#删除用户且删除其主文件夹
userdel -r zhangsan

#新建一个组
groupadd 组名
groupadd dev

#修改组名
groupmod -n new old

#删除组
groupdel 组名

#修改用户所属组
usermod -g 组名 用户名
usermod -g dev zhangsan

sudoers增加权限名单


image.png

文件权限类

#改变权限 chmod ,ugoa表示希望对哪个权限部分做更改,a表示全部
# +表示增加权限,-表示删除权限,=赋予权限。不能有空格
chmod a=rwx hi.text
#给用户加执行权限
chmod u+x hi.text
#4=r 2=w 1=x
#对文件修改最大权限
chmod 777 hi.text
#对文件夹及其子文件夹下所有文件设置权限用 -R
chmod -R 777 /data/logs

#用户可读写,所属组和其他可读
chmod 644 hi.text
 
 
 #改变文件或文件夹所有者 u  -R表示递归操作 recursive
 chown 用户 文件/文件夹
 chown log hi.text
 
#改变文件或文件夹所在组 
chgrp 用户组 文件/文件夹
chgrp happy hi.text

一个文件UGO三种不同的权限


image.png image.png
image.png

修改权限


image.png
image.png

搜索查找类

#人类可读话展示详情,文件大小会按M K 去展示而不是默认的kb单位 
# -h human 人类可读
ls -lh

#查询命令所在的位置
which ls
which which
#或者用这个查询命令所在的位置
whereis locate

#查找文件或者目录,会从指定目录向下递归遍历查找
find [搜索文件夹] [选项]

#查找当前文件夹
find -name "log"
#根据文件名称查找
find /usr -name "log"
#模糊查找
find /usr -name "*log"

#根据文件所属用户名查找文件,即属主
find /usr -user devlop

#根据文件大小来查找文件,查找size 超过10M的文件
find /usr -size +10M

#快速定位文件路径,在所有文件中查找
locate hello.text
#因为locate是根据索引数据库建立的搜索机制,所以新创建的数据要执行刷新操作把更新刷到locate上
updatedb


#grep过滤查找及|管道符 -n 显示匹配的行号
grep -n [查找关键词] [查找的文件]
grep -n boot develop.log
#管道就是把前面的处理结果通过| 管道传递给下一个命令处理
#将ls的文件名通过管道进行过滤出带有log的数据出来
ls|grep "log*"
#grep  wc :word count 统计关键词出现次数 ,空格表示分词
grep "boot" develog.log| wc

压缩和解压类

#压缩文件
gzip hi.text
#解压文件
gunzip hi.text.gz

#压缩文件目录及其子文件夹,递归 -r
   #    [myroot.zip压缩后的文件名,可以放路径,则表示要把文件压缩在指定路径下 的文件] [/root 表示要压缩的目录文件夹]
zip -r myroot.zip /root

#解压缩 -d:指定解压后的文件夹存放位置
unzip -d /backup myroot.zip

#打包并压缩文件目录
#[mytar.tar.gz 指定打包后的名称] [/root 打包的文件夹,可以用空格隔开打包多个文件]
tar -zcvf mytar.tar.gz /root
tar -zcvf mytar.tar.gz hello.text hi.text

#解压解包 -C 表示指定解压到哪个文件夹下
tar -zxvf mytar.tar.gz -C /tmp

gzip压缩文件


image.png

zip


image.png
tar
image.png

磁盘管理类

#以树形结构展示产品文件夹目录,需要安装tree命令
yum install tree

#展示指定目录树形结构
tree /
tree ./
tree /root

#查看文件和目录占用磁盘的空间大小 du: disk usage
du /root
# -h :human -s :sum -a :all
#查看总数
du -sh 
#查看所有文件夹统计
du -ah
#只查看到第几层级的统计 ,1表示就只看第一层目录结构
du --max-depth=1 -ah

 #查看磁盘剩余空间情况 df: disk free  -h:human readable 加/表示查看指定分区
 df -h /

#查看所有分区的磁盘剩余空间情况
df -h  

#下面这些都是基于内存的文件系统 
tmpfs
devtmpfs

#查看内存的使用情况
free -h 

#查看设备挂载情况 lsblk  :list block MOUNTPOINT:挂载点
# -f 查看详细信息,可以查看UUID,用于配置开启自动挂载光盘
lsblk -f

#IDE  硬盘对应 hda,hdb...
#SATA 、SCSI sda,sdb ...
#虚拟化媒体设备 vda,vdb...

#查看待挂载的光盘
ll /dev/|grep sr0
#创建挂载点文件夹作为挂载位置
mkdir /mnt/cdrom

#光盘挂载/卸载 mount /umount   一般挂载到/mnt文件夹上
mount [-t vfstype] [-o options] device dir
#手动挂载光盘 要挂载的光盘位置 挂载到的位置/mnt/cdrom
#注意如果是图形化界面会自动挂载上,不需要执行mount挂载
mount /dev/cdrom /mnt/cdrom
mount /dev/sr0 /mnt/cdrom
#卸载光盘挂载,后面是设备的位置/dev开头
umount /dev/cdrom

#查看当前的分区和挂载点来确认移动硬盘的位置
lsblk

#查看硬盘分区详情
fdisk -l
#查看到硬盘分区名称
#1硬盘挂载/卸载  fdisk 硬盘设备名
fdisk /dev/nvme0n2
#输入m查看帮助
n
w
#2指定硬盘的文件格式 make file system
mkfs -t xfs /dev/nvme0n2
#如果指定不了硬盘文件格式要求-f 强行格式化的语句
mkfs.xfs -f /dev/nvme0n2
#3挂载到挂载点上,挂载到/home/log下,表示该目录文件夹下存的内容实际是存储在/dev/nvme0n2 这块硬盘上
mount /dev/nvme0n2 /home/log
#卸载可以给设备名称,也可以直接给挂载点位置,因为是一一对应的。
umount /home/log
umount /dev/nvme0n2 


磁盘使用情况查看


image.png

外接光盘挂载


image.png
image.png

设置自动挂载光盘


image.png

硬盘分区最多16个分区


image.png

根据英文注释知道对应命令意思


image.png

进程管理类

#查看进程状态 process status
#ps只显示当前用户调用的线程和终端的线程
ps
# 也可以不加管道过滤,就是查看所有进程
#ps -ef 还多展示PPID,也就是当前进程的父进程 :process parent id
ps -ef
ps aux|grep 'java'
ps -ef|grep 'java'
#使用分页查看列表
ps -ef| less
#查看远程登录的进程
ps -ef|grep sshd

#终止进程 可以通过pid或进程名称处理, -9表示强制终止
kill -9 1233
#表示进程名称是firefox的都终止,也就是关掉所有浏览器
killall firefox
#谨慎使用killall
#终止远程连接进行,注意执行这个后就无法进行远程登录连接,因为sshd这个服务进程也被终止了,只能从物理机上进行登录,打开sshd远程服务,才能再被远程连接上。
killall sshd
systemctl start sshd 
#-9是一个信号值,可以通过-l命令查看
kill -l

#查看进程数
pstree
#分页查看,按q退出
pstree |less

#-p 显示pid   -u 显示进程所属用户
pstree -p
pstree -u

#没有该命令则执行安装
yum install pstree


#实时监控系统进程状态,默认3s刷新一次,按q退出
top
#按 shift m 表示按内存大小排序
#按 shift p 表示按cpu占用大小排序
#按 shift n 表示按进程号大小排序
#按 u 可以输入过滤用户
#按 k 可以输入要终止的进程PID,再输入终止信号 9 终止进程

 
#设置每个多少秒刷新,10s刷新
top -d 10
#监控某个进程,指定pid -p
top -p 2393
# -i idle 表示每次刷新间隔期间一直是S,睡眠状态的就不展示,用于监控目前的活跃进程
top -i

显示网络状态和端口占用信息

# netstat 查看进程网络信息,加grep是用于查找
netstat -anp
netstat -anp|grep 进程号

#查看网络端口号占用情况
netstat -nlp
netstat -nlp| grep 端口号

进程状态


image.png

ps aux


image.png
image.png

ps -ef


image.png

终止进程


image.png

pstree


image.png

实时监控系统进程状态


image.png
image.png

ni:nice 表示进程谦让的优先级,nice值越高,执行优先级越低,表示老实谦让度高,容易被插队。


image.png image.png
image.png

系统定时任务

#crontab 打开定时任务服务,查看状态
systemctl status crond

#查看定时任务列表 l:list
crontab -l

#新增标记定时任务 e:edit
crontab -e

#编辑定时任务,每个1分钟追加hello world 到 hello.text文件中
*/1 * * * * echo "hello world" >> /root/hello.txt

#通过tail 查看追加的日志
tail -20f hello.txt

crontab


image.png
image.png
image.png

软件包管理

#查询所有安装包文件列表 qa:query all
rpm -qa

# -qi query infomation表示查询详细信息
rpm -qi|grep firefox

#卸载软件
rpm -e firefox

#不检查依赖关系直接删除,不推荐
rpm -e nodeps firefox

#安装软件 rpm -ivh 包全名 
#install:安装 verbose:详细信息 hash:进度条
rpm -ivh firefox-68.1.1.x86_64.rpm


#yum 安装firefox ,-y表示交互时都直接回答yes
yum -y install firefox

#查看已经安装的软件
yum list
#查找是否有firefox安装软件
yum list|grep firefox

#移除软件
yum remove firefox

#修改yum源为国内镜像方便加载
先备份本地的
再wget下载
再替换本地的

#安装wget,wget可以通过url拉取文件
yum install wget

#wget htttp://mirro.aliyun.com/repo/ddd
wget htttp://mirro.aliyun.com/repo/ddd

yum


image.png
image.png
image.png

克隆虚拟机

Shell编程

shell脚本的格式

#第一行表示该脚本指定的默认的shell的解析器
#!/bin/sh
#!/bin/bash
#号表示注解

shell

#shell执行脚本 不需要文件有执行权限 
bash hello.sh
sh hello.sh
#带绝对路径,相对路径也行,不带默认是指当前路径下的可执行文件
sh /data/logs/hello.sh

#增加文件的可执行权限,可执行文件的颜色是绿色或不一样的颜色。
chmod +x hello.sh

#当前路径下执行脚本,需要文件有执行权限
./hello.shv

#使用source . 执行文件,一般在刷新环境变量文件时使用
source .profile
. .profile
 
 
#变量 
#环境变量建议大写
#主目录
$HOME
#当前的工作目录
$PWD
#当前使用的shell解析器
$SHELL
#当前的系统用户
$USER

#查看环境变量的值,打印到控制台上
echo $HOME
#查看全部环境变量
env
printenv |less
#查看变量
set 

#自定义变量,可以用引号进行语句赋值变量
a=3
a='hello world'
a="holy shit"
#查看变量
echo $a

#打开一个子shell,执行bash命令即可
bash
#通过ps -f 查看当前活动的进程
ps -f
#退出该子shell
exit

#定义全局变量,需要对目前的局部变量执行EXPROT,不要加$
export a
#如果子shell对父shell定义的全局变量做更改,可以更改,但是只对当前shell有效,就算再执行一次exprot a也没用

#默认变量定义是字符串,无法进行数字运算,要运算要用$(())或者$[]
c=$((5=6))
d=$[7+8]

#只读变量,常量
readonly b=6

#删除变量,不带$
unset b
unset a

#脚本的入参处理,用空格隔开表示

#$0表示脚本名称,全路径的脚步名称
$0
#$1-$9表示第一个到第九个参数
$1
#第10个及以上参数要加{}
${15}

#获取所有输入参数个数,用于做参数判断和循环处理
$#

#打印入参,$*是个整体
$*

#入参遍历处理,是个数组
$@
#脚本的返回值,正常执行返回0,其他情况非0
$?

#运算符 expr,要带空格
expr 1 + 2
#乘法,需要对*进行转译
expr 5 \* 2
#expr要进行赋值运算要用$()或反引号``,进行命令替换
a=$(5 + 2)
a= `5 + 2`
#计算表达式
$(())
$[]


#条件判断,用test 或[]
$a= 1
test $a= hello
#[ ] 条件判断,前后要有空格空开,变量比较的等号之间也要空格开
[ $a = hello  ]
#通过$?获取最后执行的结果 0表示成功,其他非0表示不等于
$?
#不等于 !=
[ $a != hello  ]

#数值比较 - eq ne lt le gt ge
[ $a -gt 3 ]
[ 8 -gt 3 ]

#文件权限判断
[ -r hello.sh ]
[ -w hello.sh ]

#文件类型判断
#文件是否存在
[ -e hello.sh ]
#是否文件类型
[ -f hello.sh ]
#是否是目录 
[ -d hello.sh ]

#多条件判断 &&  ||
[ -e hello.sh && -d hello.sh ]
#三元运算符
[ 8 -ge 3 ] && echo OK || echo notOK

#分支流程判断 if [ true ];then  fi:fi是if反过来,类似于我们代码if条件的{}

#用;分割的是两个命令
;then 相当于

换行
then

# -a 就是逻辑与 all -o 就是逻辑或 or
if [ $a -gt 18 -a $a -lt 35 ]; then echo ok;fi

单if脚本语句

#! /bin/bash
if [ "$1"x = "hello"x ]
then
    echo "hello world"
fi  


#避免空指针的健壮性写法
[ "$1"x = "hello"x ] 
#下面这个写法会因为没有入参而执行失败
[ $1 = hello ] 

多if脚本语句

#! /bin/bash
if [ "$1"x = "hello"x ]
then
    echo "hello world"
else
then
echo "hi world"
fi  


#! /bin/bash
if [ "$1"x = "hello"x ]
then
    echo "hello world"
elif[ "$1"x = "hey"x ]
then
echo "hey world"
else
then
echo "hi world"
fi  

case 脚本语句

#! /bin/bash
case $1 in
1)
    echo "one"
;;  
2)
    echo "two"
;;  
3)
    echo "three"
;;  
*)
    echo "other"
;;  
esac 
#esac是case的颠倒

for循环语句

#! /bin/bash  
sum=0
for(( i=1; i<=$1; i++ ))
do
    sum=$[ $sum + $i ]
done
echo $sum
#使用变量要加$符号 sum=$sum+$i, +是连接符,要用$[]表示运算括号起来 
#(())双小括号里面可以直接用数据的运算符号,不需要用-ge这种转译



#! /bin/bash
for i in {1..100} do sum=$[ $sum + $i ]; done; echo $sum

# {1..100} 表示1到100的序列


#! /bin/bash
for i in "$@" do echo $i; done;

# $@是参数数组

while循环语句

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


#! /bin/bash
sum = 0
while[ $i -le $1] 
do
    let sum+=i
    let i++
done
echo $sum
#let 写法不能有空格,否则会解析报错

read读取控制台输入:IO设备输入

#! /bin/bash

read -t 60 -p "请输入昵称:" name
echo "create success, $name"

函数


#时间函数 +%s输出为时间戳格式
date
date +%s
#调用函数
$(date +%s)

#路径剪切 输出:hello.sh
#截取最后一个/之后的路径字符串
basename /root/hello.sh
#路径剪切并去除后缀suffix 输出:hello
basename /root/hello.sh .sh

#获取文件名
#! /bin/bash
echo name: $(basename $0 .sh)

#截取最后一个/之前的路径字符串,输出:/root
#用于获取路径,在该路径创建文件,创建文件夹
dirname /root/hello.sh

#获取当前路径的绝对路径,避免创建文件等在相对路径下会有问题
#思路就是先cd到当前路径,再执行pwd
cd $(dirname $0)
pwd
#写成一行
echo name: $(cd $(dirname $0);pwd)

函数脚本

#! /bin/bash
function add(){
    s=$[ $1 + $2]
    #如果直接return会受限于最大返回值256的限制
    #return $?
    echo $s
}

read -p "请输入第一个整数:" a
read -p "请输入第二个整数:" b
sum=$(add $a $b)
echo "sum="$sum

文件归档,日志归档

通过该脚本实现文件的按日期归档

#! /bin/bash

#参数判断
if [$# -ne 1]
then    
    echo "参数个数有误,请输入一个参数作为归档目录名"
    exit
fi

#从参数中获取命令名称
if [ -d $1]
then 
    #打印空,表达空一行
    echo 
else
    echo "目录不存在"
    echo 
fi

#获取文件名
DIR_NAME=$(basename $1)
#获取绝对路径
DIR_PATH=$(cd $(dirname $1); pwd)
#获取当前日期
DATE=$(date +%y%m%d)

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

#定义归档的文件路径及文件名称
DEST=/data/logs/$FILE
#开始归档
echo "开始归档" 
tar -czf $DEST $DIR_PATH/$DIR_NAME

#判断压缩结果
if [ $? -eq 0]
then 
    echo 
    echo "success"
    echo "file path: $DEST"
else
    echo
    echo "fail"
fi
exit

添加到定时任务中

#查看定时任务列表
crontab -l
#编辑定时任务
crontab -e
#每天凌晨2点
0 2 * * * /data/logs/ge_log.sh /data/logs/home_log

正则表达式

#匹配出所有以a开头的字符串
cat home.log|grep ^a

#匹配出所有以log结束的字符串
cat home.log|grep log$

#匹配空行字并显示行号
cat home.log|grep -n ^$ 

#匹配指定字符r..t的字符串 .表示匹配1个字符
cat home.log|grep r..t

#匹配指定字符r*t的字符串, *表示0到n个字符
cat home.log|grep r*t
cat home.log|grep ^r*t$

#匹配指定区间的字符串
cat home.log|grep r[a-z]*t
cat home.log|grep r[a,b]*t

#用echo测试字符串匹配
echo "ddrrot"|grep r[a-z]*t


#匹配指定字符r$t的字符串, \表示对特殊字符转译
echo "r$t"|grep r\$t

#匹配手机号 -E 表示支持扩展的正则表达符号,比如{}
echo "18939998830"|grep -E ^1[345678][0-9]{9}$

文本处理工具

#截取文本第一列 -d表示要分割的符号 -f 表示要截取的列数
cut -d " " -f 1 cut.txt

#截取文本第1,2列 -d表示要分割的符号 -f 表示要截取的列数
cut -d " " -f 1,2 cut.txt

#通过管道匹配正则后再截取1,6,7列数据
cat /etc/passwd |grep bash$|cut -d ":" -f 1,6,7
# -表示第6列只有的值
cat /etc/passwd |grep bash$|cut -d ":" -f 1,6-
# 1-5列
cat /etc/passwd |grep bash$|cut -d ":" -f 1-5

#提取本机ip地址,先用grep过滤出该行,注意该行前面有空格的话1个字符位置就表示一个分割,要提取第10列
ifconfig ens33|grep netmask|cut -d " " -f 10

awk

#搜索文件以root开头的所有行,并输出该行的第7列
#$7表示匹配到的行,把该行对应的列以参数模式传入到action中,用$去取参数值处理
cat /etc/passwd |awk -F ":" '/^root/{print $7}'

#搜索文件以root开头的所有行,并输出该行的第1和第7列,中间用逗号,分割
cat /etc/passwd |awk -F ":" '/^root/{print $1","$7}'
#如果不搜索直接输出第1和第7列
cat /etc/passwd |awk -F ":" '{print $1","$7}'

#读取数据前和后执行动作,{是代码块} BEGIN END 
cat /etc/passwd |awk -F ":" 'BEGIN{print "begin search"} /^root/{print $1","$7} END{print "end search"}' 


#提取值并做加法运算,用户id加1
cat /etc/passwd |awk -F ":" '{print $3+1}'
#通过参数形式来进行运算
cat /etc/passwd |awk -v i=1 -F ":" '{print $3+i}'

#awd 内置变量 FILENAME 表示当前的文件名,如果是管道操作FILENAME是-
# NR 行号  NF 列的个数
#查看文件名及打印每一行和列数
awk -F ":" '{print "文件名:"FILENAME "行号:"NR "列数"NF}' hello.txt

#找出ifconfig中的空行的行号
ifconfig |awk '/^$/{print NR}'
ifconfig |awk '/^$/{print "找到的行号:"NR}'


#提取本机ip地址,注意awk自动过滤每行前面的空格符,所以变量是在第二列
ifconfig | awk '/netmask/{print $2}'

应用:发生消息

#查看当前在线用户列表 who
who
#查看当前用户
who am i
#查看当前用户消息功能是否打开 mesg  ,is y 表示打开
mesg
#查看在线用户列表的消息功能是否打开 ,+表示打开
who -T 
#开启关闭消息功能 n表示关闭
mesg y
mesg n
#EOF 结束发送 ctrl +c 退出
#发送消息 用户,控制台
write log pts/1

发生消息脚本

#! /bin/bash

#查看用户是否登录 -i 忽略大小写 -m 1 表示只拿第一行的数据(用于匹配到多行时)
login_user=$(who|grep -i -m 1 $1|awk '{print $1}')
# -z表示判断是否为空
if [ -z  login_user ]
then 
    echo "$1 用户不存在"
    echo
    exit
fi

#用户是否开启接受消息功能
mesg_flag=$(who -T|grep -i -m 1 $1|awk '{print $2}')
if [ $mesg_flag != "+"]
then 
    echo "$1 用户没有开启消息功能"
    echo
    exit
fi

#确认消息体是否存在
if [ -z $2]
then 
    echo "没有消息体入参"
    echo
    exit
fi

#提取消息体
message=$(echo $* |cut -d " " -f 2-)
#message=$($* |awk '{print $2-}')

#获取用户登录的终端
login_teminal=$(who|grep -i -m 1 $1|awk '{print $2}')

#写入消息 ,通过管道传输
echo $message | write $login_user $login_teminal
if [ $? !=0 ] 
then 
    echo "fail"
else
    echo "success"
fi
exit

shell


image.png
image.png
image.png

变量


image.png
image.png
image.png
image.png
image.png

运算符


image.png
条件判断
image.png
image.png
image.png

if


image.png
image.png

case


image.png

for


image.png
image.png

while


image.png

IO控制台交互


image.png

cut


image.png
awk
image.png
image.png image.png

Shell命令大全拾补

参考

Linux快捷键

疑问

上一篇 下一篇

猜你喜欢

热点阅读