linux命令大全
常用快捷命令
停止进程:ctrl + c
清屏:ctrl + l 或者 clear
彻底清屏:reset
提示和补全功能:tab
切换至以前执行过的命令:↑和↓
CentOS切换至命令行界面:ctrl + alt + F2
CentOS切换至图形界面:ctrl + alt + F1
Vim快捷操作
跳到末尾:shift + g
跳到开头:g
主机相关配置
1、网络配置
(1)查看主机当前IP信息:
ifconfig
(2)测试当前主机是否可以连接目的主机:
ping 目的IP
静态IP需要配置的项如下:
BOOTPROTO="static" #IP 的配置方法[none|static|bootp|dhcp](引导时不使用协议|静态分配IP|BOOTP协议|DHCP协议)
ONBOOT="yes" #系统启动的时候网络接口是否有效(yes/no)
IPADDR=192.168.195.100 #IP地址
GATEWAY=192.168.195.2 #网关
DNS1=192.168.195.2 #域名解析
(4)使配置IP生效:
service network restart 或者 systemctl restart network
2、主机名和主机映射配置
(1)查看当前主机名:
hostname
(2)修改当前主机名:
vim /etc/hostname(修改完成后重启生效)
不用重启修改主机名方式:
hostnamectl set-hostname 主机名
(3)配置主机hosts映射文件(为对应IP配置对应主机名):
vim /etc/hosts
加入以下:
192.168.195.100 hadoop100
192.168.195.101 hadoop101
192.168.195.102 hadoop102
192.168.195.103 hadoop103
192.168.195.104 hadoop104
192.168.195.105 hadoop105
想要物理机和Xshell能直接通过主机名映射也要配置Window下的host文件
目录位置:C:\Windows\System32\drivers\etc
服务管理
1、CentOS 6版本(CentOS 7也兼容)
查看服务:/etc/init.d/
#服务状态查看、关闭、开启、重启
查看服务状态:service 服务名 status
开启服务:service 服务名 start
停止服务:service 服务名 stop
重启服务:service 服务名 restart
#服务自启状态查看、自启关闭、自启打开
查看所有服务自启状态:setup
查看所有服务自启状态(只显示 SysV 服务):chkconfig
查看指定服务自启状态(只显示 SysV 服务): chkconfig 服务名 --list
开启指定服务的自动启动:chkconfig 服务名 on
关掉指定服务的自动启动:chkconfig 服务名 off
开启服务指定级别的自动启动:chkconfig --level 指定级别 服务名 on
关闭服务指定级别的自动启动:chkconfig --level 指定级别 服务名 off
#查看当前运行级别
查看当前运行级别:cat /etc/inittab
2、CentOS 7版本
查看服务:/usr/lib/systemd/system
#服务状态查看、关闭、开启、重启
开启服务:systemctl start 服务名
停止服务:systemctl stop 服务名
重启服务:systemctl restart 服务名
查看服务状态:systemctl status 服务名
#服务自启状态查看、自启关闭、自启打开
查看所有服务自启状态:setup
查看所有服务自启状态:systemctl list-unit-files
查看指定服务自启状态::systemctl status 服务名
开启指定服务的自动启动:systemctl enable 服务名
关掉指定服务的自动启动:systemctl disable 服务名
#查看、修改当前运行级别
查看当前运行级别:systemctl get-default
修改当前运行级别:systemctl set-default TARGET.target (这里 TARGET 取 multi-user 或者 graphic)
CentOS7 的运行级别简化为:
等价于原运行级别 3(多用户有网,无图形界面):multi-user.target
等价于原运行级别 5(多用户有网,有图形界面):graphical.target
切换到命令行界面:init 3 == ctrl + alt + F2
切换到图形化界面:init 5 == ctrl + alt + F1
重启关机
1、sync (将数据由内存同步到硬盘中)
2、halt (立即停机,关闭系统但不断电)
3、poweroff (立即关机,关闭系统且断电)
4、reboot (立即重启)
5、shutdown [选项]
#取消shutdown操作
shutdown -c
#默认1分钟后关机
shutdown == shutdown -h
#指定时间后关机
shutdown 时间 == shutdown -h 时间
#立即关机
shutdown now == shutdown -h now == poweroff
#默认1分钟后停机
shutdown -H
#指定时间后停机
shutdown -H 时间
#立即停机
shutdown -H now == halt
#默认1分钟后重启
shutdown -r
#指定时间后重启
shutdown -r 时间
#立即重启
shutdown -r now == reboot
帮助命令
1、获得帮助信息
(1)man 命令名 :获得任意命令帮助信息,例如ls(外部命令),cd(内嵌命令)
(2)help 命令名:只能获得 Shell 内部命令的帮助信息,例如cd(内嵌)
命令名 --help:只能 Shell 外部命令的帮助信息,例如ls(外部)
2、查看命令的类型,判断是否为shell内嵌命令
type 命令名
查看历史命令
1、查看历史命令:history
#查看过去历史命令
hitory
#查看之前调用的10条命令
history
#重复调用历史命令
!命令编号
#删除历史命令
history -c
目录文件操作
1、显示当前所在目录(print working directory):pwd
2、列出目录内容(list):ls
#列出当前目录内容
ls
ls -l == ll 长数据串列出,包含文件的属性与权限等等数据
ls -a 全部的文件,连同隐藏档(开头为.的文件) 一起列出来
ls -h 以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
3、切换路径:(Change Directory):cd
#绝对路径切换,必须根目录/开头
cd /home/kym/
#相对路径切换,不能以根目录/开头
cd a/b/
cd ./a/b/ 一个.表示当前目录
cd ../root/a/b/ 两个.表示上一级目录
#cd操作
cd == cd ~ 回到家目录
cd .. 回到上一级目录
cd . 回到当前目录
cd - 回到上一次所在目录
cd -P 跳转到实际物理路径,而非快捷方式路径
4、创建新目录(Make Directory):mkdir
[格式]:mkdir 创建的目录
#创建目录xiyou
mkdir xiyou(相对路径)
mkdir /xiyou (绝对路径)
#同时创建多个目录
mkdir a b
#在xiyou目录(已存在)下创建目录mingjie
mkdir xiyou/mingjie
#迭代创建多层目录
mkdir -p xiyou/dssz/meihouwang
5、删除空目录(Remove Directory):rmdir
[格式]:rmdir 要删除的空目录
#删除空目录xiyou
rmdir xiyou (相对路径)
rmdir /xiyou (绝对路径)
#同时删除多个空目录
rmdir a b
#删除xiyou目录下的空目录mingjie
rmdir xiyou/mingjie
#迭代删除多层空目录
rmdir -p xiyou/dssz/meihouwang
6、创建空文件:touch
[格式]:touch 文件名称(不带后缀默认为.txt)
#创建一个新文件
touch a(相对路径)
touch /home/kym/a(绝对路径)
#创建多个文件
touch a b c d e f
touch linode{1..10}
#vim创建一个新文件
不同于touch,vim是如果没有编辑该文件,该文件不存在
7、复制目录或文件(Copy):cp
[格式]:cp [选项] 源文件(目录) 目的目录(文件)
#将文件initial-setup-ks.fg复制到目录kym中
cp initial-setup-ks.fg /home/kym/
#将文件initial-setup-ks.fg复制到文件a.txt中(文件a.txt无内容直接复制内容,有内容可选择覆盖)
cp initial-setup-ks.fg /home/kym/a.txt
#将文件initial-setup-ks.fg复制到目录kym中,kym目录有同名文件initial-setup-ks.fg(文件覆盖)
cp initial-setup-ks.fg /home/kym/
#强制覆盖不提示是否覆盖(直接使用linux原生命令)
\cp
#递归复制目录及其所有内容(包括文件和目录)
cp -r a/ /home/kym/ (将当前目录a所有内容复制到目录kym中)
8、删除目录或文件(Remove):rm
[格式]:rm [选项] 文件或目录名称
###删除路径下文件
rm a(相对路径)
rm /home/kym/a(绝对路径)
#加-f, 强制删除不用提示确认
rm -f a
###删除目录
#加-r, 递归删除目录及目录下所有内容
rm -rf a/
#删除当前目录下所有内容(./和什么多不写,都是在当前文件夹)
rm -rf * == rm -rf ./*
#删库跑路(谨慎!)
rm -rf /*
#加-v 显示指令的详细执行过程
rm -v a
9、移动目录或文件、重命名(Move):mv
[格式]:mv /temp/movefile /targetFolder (移动文件到某个目录)
[格式]:mv oldNameFile newNameFile (文件重命名)
#移动文件到目的位置
mv initial-setup-ks.cfg /home/kym/
#移动文件到文件(将文件initial-setup-ks.cfg移动到kym下并重命名为1.cfg)
mv initial-setup-ks.cfg /home/kym/1.cfg
mv /home/kym/1.cfg initial-setup-ks.cfg
#在当前目录下将文件移动到另一个文件,等于重命名
mv initial-setup-ks.cfg 1.cfg
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10、软链接(Link):ln
[格式]:ln -s [原文件或目录] [软链接名]
#为文件在创建软链接
ln -s /root/info /home/kym/myInfo
#为目录在创建软链接
ln -s /root/foler /home/kym/myFoder
#显示当前软链接实际路径
pwd -P
#进入当前软链接实际路径
cd -P /home/kym/myFoder
#删除软链接,软连接是一个文件
rm -f 软链接名
rm -rf 软链接名
#会把软链接对应的真实目录下内容删掉
rm -rf 软链接名/
#硬链接,与inode相关,指向文件,删除所有硬链接删除源文件
#如果是文件,链接数指硬链接个数
#如果是目录,链接数指子文件夹个数
文件内容查看
1、文件内容查看(Catch):cat
[格式]:cat [选项] 文件名
#查看当前文件a内容
cat a
#加-n显示所有行的行号
cat -n a
2、文件内容分屏查看:more
[格式]:more 要查看的文件
#more是基于VI编辑器的文本过滤器
#可按页显示文本文件内容,内置了若干快捷键,更方便
空格(f):向下翻一页
回车:向下翻一行
b:返回上一屏
=:输出当前行的行号
:+f:输出文件名和当前行的行号
q:退出
3、文件内容分屏查看:less
#功能与more指令类似,但是比more指令更加强大,支持各种显示终端
#less并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。
空格(f):向下翻一页
回车:向下翻一行
b:返回上一屏
[pagedown]:向下翻动一页
[pageup] 向上翻动一页
=:显示当前行数,字节等信息
shift+g:转至结尾
g:转至开头
/字串:向下搜寻『字串』的功能;n:向下查找;N:向上查找
?字串:向上搜寻『字串』的功能;n:向上查找;N:向下查找
q:离开
4、文件头部内容查看:head
#默认查看文件头10行内容
head 文件
#查看文件头5行内容,5可以是任意行数
head -n 5 文件
5、文件尾部内容查看:tail
#默认查看文件尾部10行内容
tail 文件
#查看文件尾部5行内容,5可以是任意行数
tail -n 5 文件
#显示文件最新追加的内容,监视文件变化
tail -f 文件
ctrl+s暂停监视
ctrl+s继续监视
ctrl+c推出
#注意:vim追加内容不会被监视到,涉及到文件底层存在分区的索引
#vim追加改变内容后,文件的索引号汇编
ls -i info
输出内容到控制台
1、输出内容到控制台: echo
[格式]:echo [选项] [输出内容]
#不加引号,输出字符串
echo helloworld:helloworld
#不加引号,输出字符串时,只能输出一个空格
echo hello world:hello world
#加引号,可以输出原内容(单、双引号均可)
echo "hello world":hello world
#加-e, 支持\控制的转义字符
echo "hello\tworld":hello\tworld
echo -e "hello\tworld":hello world
#将echo输出内容重定向写入文件中
echo "内容" > 文件(覆盖写入)
echo "内容" >> 文件(追加到文件内容末尾)
#输出环境变量到控制台
env
#输出系统环境变量
echo $PATH
#输出用户环境变量
echo $USER
#输出用户主目录
echo $HOME
#输出主机名
echo $HOSTNAME
时间日期类
1、显示当前时间:date
(1)date (功能描述:显示当前时间)
(2)date +%Y (功能描述:显示当前年份)
(3)date +%m (功能描述:显示当前月份)
(4)date +%d (功能描述:显示当前是哪一天)
(5)date "+%Y-%m-%d %H:%M:%S" (功能描述:显示年月日时分秒)
(6)date +%s (功能描述:显示当前时间戳)
2、显示非当前时间:date -d
(1)date -d '1 days ago' (功能描述:显示前一天时间)
(2)date -d '-1 days ago' (功能描述:显示明天时间)
3、设置系统当前时间:date -s
date -s 字符串时间
date -s "2017-06-19 20:52:18"
4、同步时钟:ntpdate
5、查看日历:cal
#获取当前月份日历
cal
#获取当前近三月日历
cal -3
#获取本年日历
cal -y
#获取某年日历
cal 2023
#日历把周一放前面
cal -m
用户管理命令
#Linux是多用户、多任务的分时操作系统
#以下命令均采用root用户进行管理。
#root用户主目录在/root下,普通用户都会在/home/xxx下创建自己的主目录
1、添加新用户
useradd 用户名 (添加新用户) #默认主文件夹名为该用户名,并默认加入用户名组
useradd -g 组名 用户名 (添加新用户,并将该用户添加到某个组)
useradd -d /home/dave david #增加新用户david,并设置用户主目录名为dave
2、设置用户密码
passwd 用户名
3、查看用户id和用户组id
#显示tony的用户id,所在用户组id
id tony
4、查看创建了哪些用户
cat /etc/passwd
5、切换用户(Switch User)
#用户切换为嵌套切换
su 用户名称 (切换用户,只能获得用户的执行权限,不能获得环境变量)
su - 用户名称 (切换到用户并获得该用户的环境变量及执行权限)
root用户跳转普通用户不需要密码,普通用户跳转普通用户和root密码需要密码
exit:嵌套回退到上次用户权限
6、删除用户
(1)userdel 用户名 (删除用户但保存用户主目录)
(2)userdel -r 用户名 (用户和用户主目录,都删除)
7、查看当前用户信息
(1)whoami (显示目前用户名称)
(2)who am i (显示原始用户的用户名以及登陆时间)
(3)who (显示当前所有登录用户,加-T显示mesg是否开启,+表示开启)
[root@hadoop100 ~]# mesg
is y
[root@hadoop100 ~]# who -T
root ? :0 2023-09-17 15:57 (:0)
root + pts/0 2023-09-17 15:57 (:0)
root + pts/1 2023-09-20 14:23 (:0)
8、设置普通用户能通过sudo命令获得临时root权限
#要使普通用户能通过sudo命令获得临时root权限,首先需要先使用root权限对sudoers文件配置
(1)vi /etc/sudoers
#修改/etc/sudoers文件,找到下面一行(91行),在root下面添加一行,如下:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
tony ALL=(ALL) ALL
#配置如下,用户可采用sudo命令获得临时root权限,并且不需要输入密码
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
tony ALL=(ALL) NOPASSWD:ALL
#为什么管理员用户可以直接通过sudo命令获得临时root权限,而不用配置sudoers文件
#实际上已经配置了
%wheel ALL=(ALL) ALL #表示所有管理员用户组的用户可以通过sudo命令获得临时root权限
用户组管理命令
#每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。
1、新增用户组:groupadd
groupadd 组名
2、删除用户组:groupdel
groupdel 组名
3、修改用户组:groupmod
groupmod -n 新组名 老组名
4、查看创建了哪些用户组:
cat /etc/gruop
5、修改用户属于的用户组
#修改用户的初始登录组,给定的组必须存在。默认组id是 1。
usermod -g 用户组 用户名
文件权限类
-rw-------. 1 root root 1683 9月 16 23:27 anaconda-ks.cfg
-rw-r--r--. 1 root root 1714 9月 16 23:31 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 6 9月 16 23:50 公共
drwxr-xr-x. 2 root root 6 9月 16 23:50 模板
drwxr-xr-x. 2 root root 6 9月 16 23:50 视频
drwxr-xr-x. 2 root root 6 9月 16 23:50 图片
drwxr-xr-x. 2 root root 6 9月 16 23:50 文档
drwxr-xr-x. 2 root root 6 9月 16 23:50 下载
drwxr-xr-x. 2 root root 6 9月 16 23:50 音乐
drwxr-xr-x. 2 root root 6 9月 16 23:50 桌面
1、从左到右的 10 个字符表示
drwxr-xr-x
0123456789
(1)第0位
#确定文件属性
- 代表文件
d 代表目录
l 链接文件
c 字符类型设备文件 鼠标键盘等
b 块设备文件 硬盘等
(2)第1~3位
确定属主(该文件的所有者)拥有该文件的权限。---User
r w x 分别表示读、写、执行权限
(3)第4-6位
确定属组(所有者的同组用户)拥有该文件的权限,---Group
r - x 分别表示读、写、执行权限(属组一般不能写)
(4)第7-9位
确定其他用户拥有该文件的权限 ---Other
r - x 分别表示读、写、执行权限(其他用户也一般不能写)
2、r w x 作用文件和目录的不同解释
(1)作用到文件:
[r]代表可读(read): 可以读取,查看
[w]代表可写(write): 可以修改,但是不代表可以删除该文件,删除前提条件是对该文件所在的目录有写权限,才能删除该文件
[x]代表可执行(execute):可以被系统执行
(2)作用到目录:
[r]代表可读(read): 可以读取,ls可查看目录内容
[w]代表可写(write): 可以修改,目录内创建删除文件+删除目录+重命名目录
[x]代表可执行(execute):可以进入该目录
2、文件权限更改:chmod
u:所有者 g:所属组 o:其他用户 a:所有用户u、g、o 的总和
(1)第一种方式变更权限
chmod [{ugoa}{+-=}{rwx}] 文件或目录
chmod +x 文件或目录 #不加默认为a,即所有用户
(2)第二种方式变更权限
#用3个3位2进制数分别表示u,g,o的权限
chmod [mode=421] 文件或目录
#为u,g,o赋所有权限
chomd 777 a.txt
#u有读写权限,g,o只读
chomd 644 a.txt
#修改整个目录里面的所有文件的所有者、所属组、其他用户都具有可读可写可执行权限
chmod -R 777 xiyou
3、改变所有者:chown
#改变文件或者目录的所有者
chown [选项] [最终用户] [文件或目录] (功能描述:改变文件或者目录的所有者)
#递归操作
加 -R
4、改变所属组:chgrp
#改变文件或者目录的所属组
chgrp [选项] [最终用户组] [文件或目录]
#递归操作
加 -R
搜索查找类
1、查找文件或目录:find
[格式]:find [搜索范围] [选项]
-name<查询方式> 按照指定的文件名查找模式查找文件
-user<用户名> 查找属于指定用户名所有文件
-size<文件大小> 按照指定的文件大小查找文件,单位为:
b —— 块(512 字节)
c —— 字节
w —— 字(2 字节)
k —— 千字节
M —— 兆字节
G —— 吉字
(1)按文件名:根据名称查找/目录下的filename.txt文件。
#按名字a.txt在指定目录
find /root -name a.txt
#使用通配符
find xiyou/ -name "*.txt"
(2)按拥有者:
#查找/opt目录下,用户名称为kym的文件
find /opt -user kym
(3)按文件大小:
#在/home目录下查找大于10M的文件(+10M大于 -10M小于 10M等于)
find /home -size +10M
2、快速定位文件路径:locate
#locate 指令利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速定位给定的文件。
#Locate 指令无需遍历整个文件系统,查询速度较快。
#为了保证查询结果的准确度,管理员必须定期更新locate 时刻
(1)定位目录和文件路径
#由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updatedb指令创建locate数据库
updatedb
locate tmp
(2)定位命令路径
which ls
which locate
which which
whereis locate
3、过滤查找grep及“|”管道符
[格式]:grep 选项 查找内容 源文件
#基于文件查找:在当前目录的文件initial-setup-ks.cfg中查找boot
grep -n boot initial-setup-ks.cfg
-n 显示匹配行及行号。
-i 忽略大小写
-v 反向选择
-m 1,最多匹配1行
#基于查看内容的查找,需要使用管道符“|”,表示将前一个命令的处理结果输出传递给后面的命令处理
ls | grep .cfg
cat test | grep xxx
#统计文件行数、单词数、字节数、文件名(wordCount):wc
wc info
#grep和wc配合使用
grep -n boot initial-setup-ks.cfg | wc
压缩和解压、归档
1、压缩/解压文件:gzip和gunzip
(1)gzip(只能将文件压缩,压缩为.gz 文件)
[格式]:gzip 文件
gzip houge.txt
#gzip只能压缩文件不能压缩目录;不保留原来的文件;同时多个文件会产生多个压缩包
(2)gunzip(解压缩文件)
[格式]:gunzip 文件.gz
gunzip houge.txt.gz
2、压缩/解压文件或目录: zip/unzip
(1)zip(可以压缩文件和目录,压缩为.zip文件)
[格式]:zip [选项] XXX.zip 将要压缩的内容
#压缩文件,压缩后的名称为mypackage.zip
zip mypackage.zip houge.txt bailongma.txt
#递归压缩目录,加-r
zip -r myroot.zip /root
#注:zip压缩命令在windows/linux都通用,可以压缩目录且保留源文件。
(2)unzip(解压缩文件)
[格式]:unzip [选项] XXX.zip
#解压 mypackage.zip
unzip mypackage.zip
#加-d,指定解压后文件的存放目录
unzip mypackage.zip -d /tmp
3、文件或目录归档:tar
# 归档(打包)目录,压缩后的文件格式.tar.gz
[格式]:tar [选项] XXX.tar.gz 将要打包进去的内容
选项 功能
-c 产生.tar 打包文件
-v 显示详细信息
-f 指定压缩后的文件名
-z 打包同时压缩
-x 解包.tar 文件
-C 解压到指定目录
#将多个文件houge.txt bailon info打包并压缩,命名为houma.tar.gz
tar -zcvf houma.tar.gz houge.txt bailon info
#压缩目录
tar -zcvf xiyou.tar.gz xiyou/
#将houma.tar.gz解压缩到当前目录
tar -zxvf houma.tar.gz
#指定解压缩目录为/temp
tar -zxvf houma.tar.gz -C /temp
磁盘查看和分区
1、以树状形式查看目录结构:tree
#使用前需要先安装tree工具
yum install tree
2、查看文件和目录占用的磁盘空间(disk usage):du
[格式]:du 目录/文件 (显示目录下每个子目录的磁盘使用情况)
选项 功能
-h 以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;human readable
-a 不仅查看子目录大小,还要包括文件
-c 显示所有的文件和子目录大小后,显示总和
-s 只显示总和
--max-depth=n 指定统计子目录的深度为第 n 层
#显示目录下每个子目录和子文件的磁盘使用情况,以及磁盘占用总大小
du -ah
#查看当前用户主目录占用的磁盘空间大小
du -sh
#显示目录下1级子目录和子文件的磁盘使用情况,以及磁盘占用总大小
du --max-depth=1 -ah
3、查看磁盘空间使用情况(disk free):df
[格式]:df 选项 (列出文件系统的整体磁盘使用量,检查文件系统的磁盘空间占用情况)
[root@hadoop101 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 13M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda3 45G 5.0G 40G 12% /
/dev/sda1 1014M 169M 846M 17% /boot
tmpfs 394M 36K 394M 1% /run/user/0
4、查看内存使用情况:free
[root@hadoop100 ~]# free -h
total used free shared buff/cache available
Mem: 3.8G 1.0G 1.5G 60M 1.4G 2.5G
Swap: 4.0G 0B 4.0G
5、查看块设备挂载情况:lsblk
[root@hadoop100 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT#挂载点
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 4G 0 part [SWAP]
└─sda3 8:3 0 45G 0 part /
sr0 11:0 1 1024M 0 rom #光盘驱动
#加-f 查看详细的设备挂载情况,包括文件系统等
[root@hadoop100 ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 xfs 7e846417-8a39-4852-9b3b-d2fd45b22add /boot
├─sda2 swap 0baad5b7-29c8-4851-a700-2fc7de658766 [SWAP]
└─sda3 xfs df75b0d0-4cfd-4be3-aaf4-74522b52332a /
sr0
硬盘类型:IDE、SATA、SCSI
硬盘命名:IDE(hda1 hada2 hadb1...)、SATA、SCSI(sda1 sda2 sdb1 sdb2...)
6、挂载/卸载:mount/umount
挂载:将文件系统逻辑位置映射到磁盘的物理位置
物理分区1-----挂载-----> /boot
物理分区2-----挂载-----> /
物理分区3-----挂载-----> SWAP
(1)挂载设备
[格式]:mount [-t vfstype] [-o options] device dir
#挂载光盘镜像文件,将设备/dev/cdrom 挂载到 挂载点/mnt/cdrom 中
mount -t iso9660 /dev/cdrom /mnt/cdrom/
mount /dev/cdrom /mnt/cdrom/ (文件系统类型自动识别,省略-t)
#挂在前要先链接光盘光驱,注销root重新登录即可
(2)卸载设备
[格式]:umount 设备文件名或挂载点
#卸载光盘镜像文件
umount /mnt/cdrom
(3)设置开机自动挂载
vi /etc/fstab
#设置dev/cd自动挂载
/dev/cdrom /mnt/cdrom iso8660 defaults 0 0
#第一位为dump选项,1表示系统定期备份,0表示不备份;第二位表示文件系统检查优先级,0不检查。
7、磁盘分区:fdisk
(1)查看磁盘分区详情
[格式]:fdisk -l
(2)对新增硬盘进行分区操作
添加新硬盘步骤:
#步骤1:手动新增,新增硬盘后要reboot
#步骤2:对新增硬盘/dev/sdb进行分区
[格式]:fdisk 硬盘设备名
fdisk /dev/sdb
#步骤3:输入命令进行分区
#步骤4:指定文件系统
mkfs -t xfs /dev/sdb1
#步骤5:硬盘挂载
mount /dev/sdb1 /home/kym
进程管理类
计算机中,一个正在执行的程序或命令,被叫做“进程”(process);(前台进程)
启动之后一只存在、常驻内存的进程,一般被称作“服务”(service);(后台进程),服务名加d为守护进程
1、查看当前系统进程状态(process status):ps
(1)[格式]:ps (只显示当前用户进程和终端相关进程)
(2)[格式,BSD风格]:
#显示所有系统进程
ps aux
#分屏显示所有系统进程
ps aux | more
ps aux | less
#查看某进程
ps aux | grep 进程pid
#选项含义:
a 列出带有终端的所有用户的进程
x 列出当前用户的所有进程,包括没有终端的进程
u 面向用户友好的显示风格
(3)[格式,UNIX风格]:(可以查看子父进程之间的关系)
#显示所有系统进程
ps -ef
#分屏显示所有系统进程
ps -ef| more
ps -ef| less
#查看某进程
ps -ef| grep 进程pid
#选项含义:
-e 列出所有进程
-u 列出某个用户关联的所有进程,后面加用户
-f 显示完整格式的进程列表
如果想查看进程的CPU占用率和内存占用率,可以使用ps aux;
如果想查看进程的父进程ID可以使用ps -ef
2、终止进程:kill
(1)通过进程号杀死进程
kill [选项] 进程号
(2)通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用
killall 进程名称
(3)案例实操
#杀死浏览器进程,加-9 表示强迫进程立即停止
kill -9 5102
#通过进程名称杀死进程
killall firefox
#通过进程名称杀死sshd守护进程
killall ssh #谨慎使用,需要在主机上重新打开sshd服务,才能远程连接
3、查看进程树:pstree
(1)显示所有进程父子关系
pstree
(2)-p 显示进程的PID
pstree -p
(3)-u 显示进程的所属用户
pstree -u
4、实时监控系统进程状态:top
执行top后,可以按shift + p(CPU)、m(内存)、n(进程号) 对查询出的进程结果进行排序
top有ps和kill所有功能,进入后,也可以按u选择监测某用户进程,也可以按k终止进程
(1)指定刷新秒数为1s
top -d 1
(2)不显示闲置进程(从上次显示之后到目前一直没占用CPU),僵尸进程
top -i
(3)显示指定进程监控系统进程状态
top -p 2575
(4)查看磁盘IO读写情况:iotop
需要安装一下:yum install iotop、
iotop -o(直接查看输出比较高的磁盘读写程序)
5、显示网络状态和端口占用信息:netstat
ifconfig,ip查看网络信息很少
(1)查看某进程网络信息
netstat -anp | grep 进程号
(2)查看某网络端口号占用情况
netstat –nlp | grep 端口号
(3)查看某端口占用情况
netstat -tunlp | grep 端口号
#选项含义:
-a 显示所有正在监听(listen)和未监听的套接字(socket)
-n 拒绝显示别名,能显示数字的全部转化成数字
-l 仅列出在监听的服务状态
-p 表示显示哪个进程在调用
-t或--tcp 显示TCP传输协议的连线状况。
-u或--udp 显示UDP传输协议的连线状况。
#主机中进程间通信:
主机1进程:由主机1的IP + 套接字(port端口号)确定
主机2进程:由主机2的IP + 套接字(port端口号)确定
IP确定哪台主机,套接字(port端口号)确定哪个进程
6、系统定时任务:crontab
(1)使用crontab,首先要开启 crond 服务
systemctl restart crontab
(2)使用crontab
#选项含义:
-e 编辑 crontab 定时任务
-l 查询 crontab 任务
-r 删除当前用户所有的 crontab 任务
#进入crontab编辑界面,会打开vim编辑定时任务。
crontab -e
* * * * * 执行的任务
#每隔1分钟,向/root/bailongma.txt文件中添加一个 11 的数字
*/1 * * * * /bin/echo ”11” >> /root/bailongma.txt
软件包管理
RPM(RedHat Package Manager),RedHat软件包管理工具,类似windows里面的setup.exe,是Linux这系列操作系统里面的打包安装工具,它虽然是RedHat的标志,但理念是通用的。(Ubuntu包管理工具为apt)
RPM包的名称格式
Apache-1.3.23-11.i386.rpm
- “apache” 软件名称
- “1.3.23-11”软件的版本号,主版本和此版本
- “i386”是软件所运行的硬件平台,Intel 32位处理器的统称
- “rpm”文件扩展名,代表RPM软件包
1、RPM查询命令:rpm -qa
(1)查询当前所安装(q)的所有(a)RPM软件包
rpm -qa
(2)由于软件包比较多,一般都会采取过滤查找。
rpm -qa | grep RPM软件包
(3)查询某RPM软件详细信息
rpm -qi firefox
2、RPM卸载命令:rpm -e
(1)rpm -e RPM软件包
(2)rpm -e --nodeps RPM软件包
#选项含义
-e 卸载软件包
--nodeps 卸载软件时,不检查依赖。这样的话,
那些使用该软件包的软件在此之后可能就不能正常工作.
3、RPM 安装命令:rpm -ivh
rpm -ivh RPM包全名
#选项含义
-i install,安装
-v --verbose,显示详细信息
-h --hash,进度条
--nodeps 安装前不检查依赖
仓库配置:YUM
YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的 Shell 前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
1、yum常用命令
[格式]:yum [选项] [参数]
#选项:
-y 对所有提问都回答“yes”
#参数
install 安装 rpm 软件包
update 更新 rpm 软件包
check-update 检查是否有可用的更新 rpm 软件包
remove 删除指定的 rpm 软件包
list 显示软件包信息
clean 清理 yum 过期的缓存
deplist 显示 yum 软件包的所有依赖关系
2、修改网络YUM源
在/etc/yum.repos.d/目录下,替换默认的 repos 文件
Shell编程
外层应用程序--->Shell--->linux内核--->硬件
什么是Shell?
Shell是一个命令行解释器程序(c语言编写),也是用户和linux内核之间的接口,为用户或应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Bash(GNU Bourne-Again Shell)是最常用的一种Shell,是当前大多数Linux发行版的默认Shell。
即Shell是总称,Bash是Shell的一个版本。此外,还包括sh,ksh,rsh,csh等
Shell既是一种命令语言,又是一种程序设计语言(解释型的编程语言)。
什么是Shell脚本?
Shell脚本:将Linux命令和Shell自身的编程语言封装形成可执行的文件(.sh),Shell脚本通常用来批量重复执行一些业务。
Shell脚本优点:
1、交互式,易编写、易调试、灵活性强。
2、可以通过Shell脚本重复批量地执行一些任务,适合一些自动化的业务,例如系统性能监视、环境搭建、日志分析等
3、启动快速
Shell脚本缺点:
1、不适合复杂业务逻辑的大型业务
2、语法复杂,没有其他脚本语言数据结构丰富
3、执行速度慢
4、出现错误时往往代价高昂,一个命令出现错误就会相差十万八千里。
查看当前使用的Shell命令解释器
#echo $SHELL
1、编写shell脚本
脚本以#!/bin/bash开头(指定解析器)
[atguigu@hadoop101 shells]$ touch helloworld.sh
[atguigu@hadoop101 shells]$ vim helloworld.sh
在 helloworld.sh 中输入如下内容
#!/bin/bash
echo "helloworld
2、shell执行方式
(1)采用 bash 或 sh+脚本的相对路径或绝对路径(不用赋予脚本+x 权限)
sh ./helloworld
sh /home/atguigu/shells/helloworld.sh
bash ./helloworld.sh
bash /home/atguigu/shells/helloworld.sh
(2)采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
helloworld.sh #报错,配置系统环境变量即可直接执行
chmod +x helloworld
./helloworld.sh
/home/atguigu/shells/helloworld.sh
(3)使用. 和 source 的方式来执行
. helloworld.sh
source helloworld.sh
3、变量
全局变量(所有子shell可见),局部变量
(1)查看某个系统变量的值
echo $HOME
(2)查看所有全局环境变量
env
printenv
#查看某个全局环境变量,不用加$
printenv USER
#当要用到环境变量的值时,加$
ls $HOME
(3)显示当前Shell中所有环境变量
set
(4)变量定义
#定义变量 A,等号两侧不能有空格
A=5
echo $A
5
#给变量A重新赋值
A=8
echo $A
8
#撤销变量 A
unset A
echo $A
#声明静态的变量 B=2,不能 unset
readonly B=2
echo $B
2
B=9 #报错
-bash: B: readonly variable
#在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
C=1+2
echo $C
1+2
#变量的值如果有空格,需要使用双引号或单引号括起来
D=I love banzhang
-bash: world: command not found #报错
D="I love banzhang"
echo $D
I love banzhang
#可把变量提升为全局环境变量,可供其他 Shell 程序使用
export 变量名
vim helloworld.sh
在helloworld.sh 文件中增加 echo $B
#!/bin/bash
echo "helloworld"
echo $
4、特殊变量
[atguigu@hadoop101 shells]$ vim parameter.sh
写入以下:
#!/bin/bash
echo '==========$n=========='
#n为数字,$0代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
echo $0 #默认为路径下的脚本名
echo $1
echo $2
echo '==========$#=========='
#获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性
echo $#
echo '==========$*=========='
#这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
echo $*
echo '==========$@=========='
#这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
echo $@
[atguigu@hadoop101 shells]$ ./parameter.sh a b c d e f g
==========$n==========
./parameter.sh
a
b
==========$#==========
7
==========$*==========
a b c d e f g
==========$@==========
a b c d e f g
$? 最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确。
[atguigu@hadoop101 shells]$ ./helloworld.sh
hello world
[atguigu@hadoop101 shells]$ echo $?
0
5、运算符
#采用expr运算
[root@hadoop100~]# expr 1+2
1+2
[root@hadoop100~]# expr 1 + 2
3
[root@hadoop100~]# exprl 5 - 2
3
[root@hadoop100 ~]# expr 5 * 2
expr:语法错误
[root@hadoop100 ~]# expr 5 \* 2
10
[root@hadoop100 ~]# a=`expr 5 \* 2` 或者 a=$(expr 5 \* 2)
[root@hadoop100~]# echo $a
10
#采用 “$((运算式))” 或 “$[运算式]
[root@hadoop100~]# echo $[5 * 2]
10
[root@hadoop100~]# echo $[5*2] #常用
10
[root@hadoop100~]# echo $((5*2)) #常用
10
[root@hadoop100~]# a=$[6+8]
[root@hadoop100~]# echo $a
14
例子:
计算(2+3)*4 的值
[atguigu@hadoop101 shells]# S=$[(2+3)*4]
[atguigu@hadoop101 shells]# echo $S
shell编写求输入两数的和
vim add.sh
#!/bin/bash
sum=$[$1 +$2] #运算时要加$
echo sum=$sum
./add.sh 25 89
6、条件判断
(1)相等,不等条件判断
#test condition
[root@hadoop100 scripts]# a=hello
[root@hadoop100 scripts]# echo $a
hello
[root@hadoop100 scripts]# test $a = hello
[root@hadoop100 scripts]# echo $?
0
[root@hadoop100 scriptsl# test $a = Hello
[root@hadoop100 scriptsj# echo $?
1
#[ condition ](注意 condition 前后要有空格)
[rootghadoop100 scripts]#[ $a = Hello ] #除了前后要空格,等号左右也要有空格
[root@hadoop100 scriptsj# echo $?
0
[root@hadoop100 scripts]#[ $a = hello ]
[root@hadoop100 scriptsj# echo $?
1
[root@hadoop100 scripts]#[ $a=hello ] #识别为1个值,为true,返回0
[root@hadoop100 scriptsj# echo $?
0
[root@hadoop100 scripts]#[ afafdsfadsa ] #输入一串字符串,为true,返回0
[root@hadoop100 scripts]# echo $?
0
[root@hadoop100 scripts]#[ ] #空值,为false,返回1
[root@hadoop100 scripts]# echo $?
1
[root@hadoop100 scripts]#[ $a != Hello ] #判断是否不等
[root@hadoop100 scriptsj# echo $?
1
[rootahadoop100 scripts]#[ $a != hello ]
[root@hadoop100 scriptsj# echo $?
0
[root@hadoop100 scripts]#[ 2 = 8 ] #为false,返回1(以字符串形式比较)
[root@hadoop100 scriptsj# echo $?
1
[root@hadoop100 scripts]#[ 2 = 2 ] #为true,返回0(以字符串形式比较)
[root@hadoop100 scriptsj#echo $?
0
[root@hadoop100 scripts]#[ 2 < 5 ] #报错,数值比较不能用符号比较
[root@hadoop100 scriptsj#echo $?
0
(2)常用判断条件
#两个整数之间比较
-eq 等于(equal) -ne 不等于(not equal)
-lt 小于(less than) -le 小于等于(less equal)
-gt 大于(greater than) -ge 大于等于(greater equal)
注:如果是字符串之间的比较 ,用等号“=”判断相等;用“!=”判断不等。
#按照文件权限进行判断
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
(3)按照文件类型进行判断
-e 文件存在(existence)
-f 文件存在并且是一个常规的文件(file)
-d 文件存在并且是一个目录(directory)
例1:helloworld.sh 是否具有写权限
[atguigu@hadoop101 shells]$ [ -w helloworld.sh ]
[atguigu@hadoop101 shells]$ echo $?
0
例2:/home/atguigu/cls.txt 目录中的文件是否存在
[atguigu@hadoop101 shells]$ [ -e /home/atguigu/cls.txt ]
[atguigu@hadoop101 shells]$ echo $?
1
(3)多条件判断
&& 表示前一条命令执行成功时,才执行后一条命令,
|| 表示上一条命令执行失败后,才执行下一条命令
a=27
[ $a -lt 20 ] && echo "$a < 20" || echo "$a >= 20"
27 >= 20
a=15
[ $a -lt 20 ] && echo "$a < 20" || echo "$a >= 20"
15 < 20
[ atguigu ] && echo OK || echo notOK
oK
[ ] && echo OK || echo notOK
notOK
7、分支语句
流程控制:顺序,(选择)分支,循环
注意事项:
[ 条件判断式 ],中括号和条件判断式之间必须有空格
if 后要有空格
(1)单分支——if
#格式1,加;
if [ 条件判断式 ];then #加;表示连续执行一行两个语句
程序
fi
#格式2
if [ 条件判断式 ] #不加;
then
程序
fi
例1:
#!/bin/bash
if [ "$1"x = "kym"x]
then
echo "welcome,kym"
fi
例2:
if [ $a -gt 18 ]; then echo OK; fi
OK
a=15
if [ $a -gt 18 ]; then echo OK; fi
例3:
a=36
if [ $a -gt 18 ] && [ $a -lt 35 ]; then echo OK; fi
a=25
if [ $a -gt 18 ] && [ $a -lt 35 ]; then echo OK; fi
oK
例如4:-a表示and,-o表示or
a=40
if [ $a -gt 18 -a $a -lt 35 ]; then echo OK; fi
a=20
if [ $a -gt 18 -a $a -lt 35 ]; then echo OK; fi
OK
(2)多分支——if elif else
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
例1:
#!/bin/bash
if [ "$1"x = "kym"x ] #字符串判断
then
echo "welcome,kym"
fi
if [ $2 -lt 18 ]
then
echo "未成年"
else
echo "成年"
fi
例2:
[atguigu@hadoop101 shells]$ touch if.sh
[atguigu@hadoop101 shells]$ vim if.sh
#!/bin/bash
if [ $1 -eq 1 ]
then
echo "banzhang zhen shuai"
elif [ $1 -eq 2 ]
then
echo "cls zhen mei"
fi
[atguigu@hadoop101 shells]$ chmod 777 if.sh
[atguigu@hadoop101 shells]$ ./if.sh 1
banzhang zhen shuai
(3)多分支——case语句
case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
(1)case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
(2)双分号“;;”表示命令序列结束,相当于break。
(3)最后的“*)”表示默认模式,相当于default。
例:
$ touch case.sh
$ vim case.sh
!/bin/bash
case $1 in
"1")
echo "one"
;;
"2")
echo "two"
;;
"3")
echo "three"
;;
*)
echo "number else"
;;
esac
8、循环
(1)for循环
#格式1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
#格式2
for 变量 in 值 1 值 2 值 3…
do
程序
done
#例1:
touch for1.sh
vim for1.sh
#!/bin/bash
sum=0
for((i=0;i<=100;i++)) #(())里数值运算可以直接用> >= < <=
do
sum=$[$sum+$i]
done
echo $sum
[atguigu@hadoop101 shells]$ chmod 777 for1.sh
[atguigu@hadoop101 shells]$ ./for1.sh
5050
#例2:
for os in linux windows macos; do echo $os; done
linux
window
smacos
#例3:
for i in {1..100}; do sum=$[$sum+$i]; done; echo $sum
5050
#$*和$@的区别
#!/bin/bash
echo '=============$*============='
for i in $*
do
echo "ban zhang love $i"
done
echo '=============$@============='
for j in $@
do
echo "ban zhang love $j"
done
[atguigu@hadoop101 shells]$ chmod 777 for3.sh
[atguigu@hadoop101 shells]$ ./for3.sh cls mly wls
=============$*=============
banzhang love cls
banzhang love mly
banzhang love wls
=============$@=============
banzhang love cls
banzhang love mly
banzhang love wls
#!/bin/bash
echo '=============$*============='
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个 for 循环只会循环一次
do
echo "ban zhang love $i"
done
echo '=============$@============='
for j in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "ban zhang love $j"
done
[atguigu@hadoop101 shells]$ chmod 777 for4.sh
[atguigu@hadoop101 shells]$ ./for4.sh cls mly wls
=============$*=============
banzhang love cls mly wls
=============$@=============
banzhang love cls
banzhang love mly
(2)while循环
[格式]:
while [ 条件判断式 ]
do
程序
done
例1:
[atguigu@hadoop101 shells]$ touch while.sh
[atguigu@hadoop101 shells]$ vim while.sh
#!/bin/bash
i=1
while [ $a -le $1 ]
do
sum=$[$sum+$a]
a=$[$a+1]
done
echo $sum
[atguigu@hadoop101 shells]$ chmod 777 while.sh
[atguigu@hadoop101 shells]$ ./while.sh 100
5050
例2:
a=l
while [ $a -le $1 ]
do
let sum2+=a
let a++
done
echo $sum2
1、读取控制台输入:read
read (选项) (参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)如果-t 不加表示一直等待
参数
变量:指定读取值的变量名
例:
[atguigu@hadoop101 shells]$ touch read.sh
[atguigu@hadoop101 shells]$ vim read.sh
#!/bin/bash
read -t 7 -p "Enter your name in 7 seconds :" NN
echo $N
1、函数
(1)系统函数
截取路径文件名:basename
basename [string/pathname] [suffix] (会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来,可以理解为取路径里的文件名称)
选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix 去掉。
#例
截取该/home/atguigu/banzhang.txt 路径的文件名称。
[atguigu@hadoop101 shells]$ basename /home/atguigu/banzhang.txt
banzhang.txt
[atguigu@hadoop101 shells]$ basename /home/atguigu/banzhang.txt .txt
banzhang
截取绝对路径:dirname
dirname 文件绝对路径 (从给定的包含绝对路径的文件名中去除文件名,然后返回剩下的路径部分,可以理解为取文件路径的绝对路径名称
#例1
获取 banzhang.txt 文件的路径。
[atguigu@hadoop101 ~]$ dirname /home/atguigu/banzhang.txt
/home/atguigu
#例2
# !/bin/bash
echo '===========$n============'
echo script name : $(basename $0.sh) #$(命令):调用系统函数,命令替换
echo script path :$(cd $(dirname $0);pwd) #保证截取绝对路径
echo 1st paramater : $1
echo 2nd parameter: $2
echo '===========$#============'
echo parameter numbers : $#
echo '===========$*============'
echo $*
echo '===========$@============'
echo $@
(2)自定义函数
[ function ] funname[()]
{
Action;
[return int;]
}
(1)必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一
样先编译。
(2)函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将
以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)
#例
[atguigu@hadoop101 shells]$ touch fun.sh
[atguigu@hadoop101 shells]$ vim fun.sh
#!/bin/bash
function sum()
{
s=0
s=$[$1+$2]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;
[atguigu@hadoop101 shells]$ chmod 777 fun.sh
[atguigu@hadoop101 shells]$ ./fun.sh
Please input the number1: 2
Please input the number2: 5
7
1、正则表达式
#正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中,grep,sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配。
(1)常规匹配
一串不包含特殊字符的正则表达式匹配它自己,例如:
[atguigu@hadoop101 shells]$ cat /etc/passwd | grep atguigu
就会匹配所有包含 atguigu 的行
(2)特殊字符
#特殊字符:^
^ 匹配一行的开头,例如:
cat /etc/passwd | grep ^a
会匹配出所有以 a 开头的行
#特殊字符:$
$ 匹配一行的结束,例如
cat /etc/passwd | grep t$
会匹配出所有以 t 结尾的行
思考:^$ 匹配什么?
匹配空行,加-n 显示空行所造行数
#特殊字符:.
. 匹配一个任意的字符,例如
cat /etc/passwd | grep r..t
会匹配包含 rabt,rbbt,rxdt,root 等的所有行
特殊字符:*
* 不单独使用,他和上一个字符连用,表示匹配上一个字符 0 次或多次,例如
[atguigu@hadoop101 shells]$ cat /etc/passwd | grep ro*t
会匹配 rt, rot, root, rooot, roooot 等所有行
思考:.* 匹配什么?
匹配任意字符串
grep ^a.*in$ #匹配指定开头结尾,中间任意
grep ^a.*var.*in$ #匹配指定开头结尾,中间有var
字符区间(中括号):[ ]
[ ] 表示匹配某个范围内的一个字符,例如
[6,8]------匹配 6 或者 8
[0-9]------匹配一个 0-9 的数字
[0-9]*------匹配任意长度的数字字符串
[a,b]------匹配 a 或者 b
[a-z]------匹配一个 a-z 之间的字符
[a-z]* ------匹配任意长度的字母字符串
[a-c, e-f]-匹配 a-c 或者 e-f 之间的任意字符
cat /etc/passwd | grep r[a,b,c]*t
会匹配 rt,rat, rbt, rabt, rbact,rabccbaaacbt
特殊字符:\
\ 表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如,我想找出所有包含 '$' 的行),
就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身,例如
cat /etc/passwd | grep ‘a\$b’ 就会匹配所有包含 a$b 的行。注意需要使用单引号将表达式引起来。
匹配手机号码:
grep ^1[34579][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$
grep -E ^1[34579][0-9]{9}$
1、文本处理工具
(1)剪切:cut
cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
cut [选项参数] filename
说明:默认分隔符是制表符
#选项参数说明
选项参数 功能
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列,默认是制表符“\t”
-c 按字符进行切割 后加加 n 表示取第几列 比如 -c 1
(2)awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
awk [选项参数] ‘/pattern1/{action1} /pattern2/{action2}...’ filename
pattern:表示 awk 在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
#选项参数说明
-F 指定输入文件分隔符
-v 赋值一个用户定义变量
其他命令补充
1、给出文件不同
cmp 文件1 文件2
2、给出两个文件不同的内容
diff 文件1 文件2
3、查看系统信息
uname
uname -a
面试常考命令梳理
1、文件权限标签:总结,文件,查看,echo,命令,sh,Linux,root,目录 From: https://www.cnblogs.com/SaturnRing/p/18355126
chmod [{ugoa}{+-=}{rwx}] 文件或目录
chmod [mode=421] 文件或目录
-R 表示迭代赋权,例如 chmod -R 777 xiyou
2、磁盘查看和分区类
查看文件和目录占用的磁盘空间:du -h
查看磁盘空间使用情况:df -h
查看磁盘IO读写情况:iotop
需先安装包:yum install iotop
iotop -o(直接查看输出比较高的磁盘读写程序)
3、查看系统内存使用情况:
free -h
4、进程管理类
查看系统进程信息:
ps
ps aux (可以查看到CPU和内存占用情况)
ps -ef (可以查看到进程的父子京城关系)
查看某进程的pid:
ps aux | grep 进程名
ps -ef | grep 进程名
查看某进程信息:
ps aux | grep 进程pid/进程名
ps -ef | grep 进程pid/进程名
查看当前CPU占用最高的进程:
(1)方法1
使用sort对CPU占用进行排序:ps aux|sort -nr -k3|head -n 1
参数解析
sort #排序命令
-nr #默认使用字符串排序,n代表使用数值进行排序 默认从小到大排序 r代表反向排序
-k3 #以第3列进行排序
head -n 1 显示第一行内容
(2)方法2
top,可以按shift + p(CPU)、m(内存)、n(进程号) 对查询出的进程结果进行排序
实时查看系统进程状态:
top
实时查看指定进程状态:
top -p 进程pid
结束进程:
(1)kill -9 进程pid
(2)kullall 进程名 //pkill
查看进程树:pstree
(1)显示所有进程父子关系:pstree
(2)-p 显示进程的PID:pstree -p
(3)-u 显示进程的所属用户:pstree -u
5、查看网络状态和端口占用信息:netstat
查看端口是否被占用:netstat -anp
(1)查看某进程网络信息
netstat -anp | grep 进程pid
(2)查看某端口号占用情况
netstat –nlp | grep 端口号
(3)查看某端口号占用情况(TCP和UDP)
netstat -tunlp | grep 端口号
6、压缩/解压文件
gzip/ungzip:只能压缩/解压文件
zip/unzip:
#压缩文件
zip xxx.zip 文件
#压缩目录,加-r
zip -r xxx.zip 目录
#解压文件到当前目录
unzip xxx.zip
#加-d,指定解压后文件的存放目录
unzip xxx.zip -d /tmp
tar -zcvf压缩和tar -zxvf 解压:
#压缩文件
tar -zcvf xxx.tar.gz 文件
#压缩目录
tar -zcvf xxx.tar.gz 目录
#解压缩
tar -zxvf xxx.tar.gz
#加-C,指定解压缩目录为/temp
tar -zxvf xxx.tar.gz -C /tmp
7、文件查找和定位
查找:find
(1)按文件名查找:find /root -name a.txt
#使用通配符
find xiyou/ -name "*.txt"
(2)按拥有者查找:find /opt -user kym
(3)按文件大小查找:find /home -size +10M
定位:locate
8、日志查看
cat 文件
more 文件
less 文件
head 文件 head -n 5 文件
tail 文件 tail -n 5 文件
查看动态日志: tail -f 文件(显示文件最新追加的内容,监视文件变化)
9、统计文件行数、单词数、字节数、文件名:
wc 文件
统计文件行数
wc -l 文件
10、查看当前系统用户:whoami
11、快速查看某命令:whatis
12、查看某命令所在路径:which
13、查看某命令所在所有路径:whereis
----------------------------------------------------------------------------
linux搭建测试环境
1、解压文件:tar
2、测试发现bug,查看日志 : tail -f
3、修改配置:vim
4、安装tomcat:看服务有没有启动可以用:systemctl status tomcat
或者 ps -ef | grep tomcat
5、查看端口是否被进程占用:netstat -anp
6、结束进程 kill -9 进程pid